У меня возникают проблемы с пониманием того, как Post Increment (++
), Предварительное увеличение (--
) и сложение / вычитание работают вместе в примере.
x++
означает добавить 1 к переменной.
x--
означает вычесть 1 из переменной.
Но меня смущает этот пример:
int x = 2, y = 3, z = 1;`
y++ + z-- + x++;
Я предполагаю, что это означает 3(+1) + 1(-1) + 2(+1)
Что означает, что результат должен быть 7.
Но когда я его компилирую, я получаю 6
, Я не понимаю
int main() {
int x=2, y=3, z=1;
int result;
result = y++ + z-- + x++; //this returns 6
cout << result << endl;
return 0;
}
result = y++ + z-- + x++;
3 1 2 = 6
если вы выполните это снова
result1 = y++ + z-- + x++;
4 0 3 = 7
причина
operator++
возвращает исходное значение до увеличения переменной.
а также
++operator
возвращает увеличенное значение
--
такой же, как и выше, только его декремент
Потому что постфикс operator++
возвращает исходное значение до увеличения переменной. Префикс operator++
увеличивает переменную и возвращает ссылку на нее. Поведение может быть легко проиллюстрировано на примере:
#include <iostream>
int main()
{
int n = 1;
std::cout << n++ << "\n"; // prints 1
std::cout << n << "\n"; // prints 2
int m = 10;
std::cout << "\n";
std::cout << ++m << "\n"; // prints 11
std::cout << m << "\n"; // prints 11
}
когда ты пишешь x++
он использует текущее значение x
а затем увеличивает его на единицу.
ты хочешь написать ++x
вместо этого, если вы хотите увеличить в первую очередь.
Pre-increment operator(++p)
сначала увеличьте значение и назначьте его и post increment operator(p++)
сначала присвойте значение, а затем выполните операцию инкремента. Здесь все переменные являются постинкрементными, т. е. первоначально присваивают свое значение (в буфере), затем увеличивают (для y и x на 1) и уменьшают z на 1., т.е.
первоначально назначьте 3 + 1 + 2 в буфере (добавление выполняется для значения буфера), а затем выполните увеличение / уменьшение как x = 3, y = 4 и z = 0
для получения дополнительной информации вы можете прочитать ответ на Каков правильный ответ для cout << C ++ << с ;? а также Почему эти конструкции (использующие ++) неопределенного поведения? вопросы
Положение ++
иметь значение.
Если
++
предшествует переменной, например,++counter
возвращаемое значение
значение в счетчике после его увеличения. Если++
следует за
переменная, напримерcounter++
, возвращаемое значение является значением в счетчике
прежде чем он был увеличен.
Postincrement / postdecrement будет увеличивать / уменьшать переменную, но оценивать ее как «предыдущее» значение.
Итак, выражение result = y++ + z-- + x++
будет действовать что-то вроде:
result = y + z + x; // result == 6
// perform the 'post' operations
y += 1;
z -= 1;
x += 1;
Тем не менее, имейте в виду, что компилятор будет выполнять оценку исключительно строго. Для этого выражения результаты хорошо определены, и вы в конечном итоге, как в примере. При использовании нескольких операций увеличения / уменьшения в одном и том же выражении легко включить неопределенное поведение, когда вы не сможете ожидать чего-то конкретного от выражения. Увидеть Почему эти конструкции (использующие ++) неопределенного поведения? для деталей.
Причина проста.
Здесь используется принцип ассоциации, который вычисляет значения в соответствии с приоритетами операторов.
ТАКЖЕ X++
или же X--
значит … ИСПОЛЬЗОВАТЬ, ЧЕМ ИЗМЕНИТЬ …
Сначала он будет использовать значение и увеличивать или уменьшать его.
Если вы хотите получить вывод 7
…
попробуй это .. это может сработать …
result = ++y + z-- + x++;
i++
/i--
это пост приращение и уменьшение переменной …
таким образом, в нашем выражении для решения будет принято начальное значение, а затем inc / dec на 1.
int x = 2, y = 3, z = 1;
y++ + z-- + x++;
2 + 3 + 1 = 6