Постинкрементный и преинкрементный оператор
Пожалуйста, объясните мне результат этого кода.
// кодируем a, когда я запускаю этот код на своем ноутбуке, значение y равно 4. И я думаю, что логически значение y должно быть 5, потому что при выполнении x ++ оно должно возвращать 2 без приращения, как после увеличения, а затем, когда мы добавляем х, который теперь содержит увеличенное значение, то есть 3. Таким образом, 2 + 3 равно 5, по моему мнению. Но согласно моему turbo C++ 3.0 ответ - 4.
#include <stdio.h>
void main()
{
int x = 2,y;
**int y = x++ + x;** // ans 4
printf("y is :%d", y);
}
// код B Когда я запускаю этот код, отвечаю 6. Здесь turbo C++ 3.0 в ++x собирает увеличенное значение x++, которое противоположно приведенному выше коду. Логически здесь ответ правильный, но в приведенном выше коде его нет. #включают
void main()
{
int x = 2,y;
**int y = x++ + ++x;** //and 6
printf("y is :%d", y);
}
2 ответа
Во-первых, оператор присваивания, который является =
работает справа налево, что означает, что если вы пишете x = 2 + 4 + 1;
ваш компилятор начинает читать его с самой правой цифры 1
тогда добавь 4
к нему и так далее, а затем он присваивает это значение x
,
Итак, в вашем случае заявление y = x++ + x;
компилятор начинает видеть это справа, то есть сначала видит x
т.е. 2
а потом видит x++
т.е. также 2
как это оператор постинкрементного, наконец, он добавляет их и назначает y
как 2 + 2
то есть 4
,
Во втором случае это y = x++ + ++x;
компилятор сначала смотрит на ++x
и так как это предварительный оператор приращения, он увеличивается x
с одним, т.е. x
сейчас 3
, После этого x++
видно и как указано выше, потому что это почтовый оператор, он будет рассматриваться как x
в этой операции, и это значение 3
(помните, мы увеличили x
на один ранее) и, следовательно, компилятор присваивает 3 + 3
т.е. 6
в y
,
Первая программа, где результат 4
#include <stdio.h> void main() { int x = 2,y; **int y = x++ + x; // x=2, so y=2+2=4 printf("y is :%d", y); // after post increment x=3 }
Поскольку переменная получает его только после увеличения значения только после завершения выполнения оператора, поэтому y=2+2
Вторая программа, где результат 6.
Ассоциативность оператора ++ "справа налево"
void main() { int x = 2,y; **int y = x++ + ++x; //Since associativity is left to right so y=3+3=6 printf("y is :%d", y);// after the post increment x=4 }
Здесь предварительное увеличение выполняется первым, так как из-за правила ассоциативности, поэтому y=3+3