Это связано с приоритетом оператора? - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть код ниже:

#include<algorithm>
#include<cstdio>
#include<iostream>
#include<vector>
#include<numeric>

using namespace std;

int maxScore(vector<int>& cardPoints, int k) {
    if(k==cardPoints.size()) return accumulate(cardPoints.begin(), cardPoints.end(), 0);

    int endSum=accumulate(cardPoints.begin()+(cardPoints.size()-k), cardPoints.end(), 0);
    int maxValue=endSum;
    int i=0;
    int j=cardPoints.size()-k;

    while(i<k && j<cardPoints.size()) {
        endSum-=cardPoints[j++]+cardPoints[i++];   //-> will change this line
        maxValue=max(maxValue, endSum);
    }

    return maxValue;
}

int main() {
    vector<int> v={100,40,17,9,73,75};
    cout<<maxScore(v, 3);

    return 0;
}

Вывод, который я получаю: 157. Однако, если я изменю строку, прокомментированную выше, как:

endSum=endSum-cardPoints[j++]+cardPoints[i++];

, то получу вывод 248. Живые примеры здесь и здесь соответственно. Я не думаю, что я делаю что-то другое в двух утверждениях выше. Я думаю это может быть связано с операциями после увеличения для i и j. Поскольку все они выполняются в одной строке, я не могу использовать какие-либо операторы печати для отладки.

Может кто-нибудь указать, почему я получаю другой вывод?

Ответы [ 2 ]

2 голосов
/ 27 апреля 2020

Эта строка:

a -= b + c;

эквивалентна:

a = a - (b + c);

или

a = a - b - c;

, что не так же, как :

a = a - b + c;
1 голос
/ 27 апреля 2020
endSum -= cardPoints[j++] + cardPoints[i++];

Эквивалентный оператор с = будет:

endSum = endSum - (cardPoints[j++] + cardPoints[i++]);

или

endSum = endSum - cardPoints[j++] - cardPoints[i++];
...