Sunil Kumar Das Ответов: 3

операция инкремента и декремента в c


#include<stdio.h>
#include<math.h>
int main()
{
    int a=2,b;
    b=a++ + a-- + ++a + --a;
    printf("%d %d",a,b);
}




выход-2 9 почему?????

3 Ответов

Рейтинг:
22

Ron Beyer

Ах, я ожидал этого от вашего последнего...

Оператор предварительного приращения и операторы + имеют равный приоритет. Это означает, что то, что делается первым, полностью зависит от компилятора. Это называется неопределенным поведением, и подобных утверждений следует избегать любой ценой.

Почему это происходит в вашем компиляторе? Это просто приоритет, в котором компилятор решил применить префиксные операторы + и++/--. Я не работал с вашим уравнением, но оно может либо сначала сложить, либо сначала вычесть.

В последнее время об этом идет оживленная дискуссия здесь[^], прочитайте нить, чтобы увидеть, что сказано, и игнорируйте парня, который этого не понимает :)


Рейтинг:
2

Member 10581154

int a=2,b;
b=a++ + a-- + ++a + --a;
b=2+3+3+2

ANS является (2,10)


Richard Deeming

Прочитайте предыдущие решения. Поведение не определено, и два решения, опубликованные шесть лет назад, уже объясняют, почему.

Рейтинг:
14

nv3

Первый результат (2) довольно очевиден, потому что a увеличивается в два раза и уменьшается в два раза. Следовательно a имеет впоследствии то же значение, что и прежде.

Второй результат (9) - это тот, который не так легко увидеть. Значение b зависит от времени, когда компилятор выбирает выполнение операций постинкремента и пострекремента. Ваш компилятор выбрал их после того, как все выражение было завершено. Следовательно, b вычисляется как:

b = 2 + 2 + 3 + 2;
    // afterwards the post-increment and post-decrement operators
    // are performed

Обратите внимание, что при выполнении операций предварительного инкремента и предварительного декремента у компилятора нет другого выбора, кроме как выполнять их сразу же. Следовательно, последние два значения равны 3 и 2.

Как правильно указал Рон в решении 1, результат этого выражения фактически не определен. Компилятор мог бы выбрать выполнение операций постинкремента и пострекремента в более раннее время, и это могло бы привести к:
b = 2 + 3 + 3 + 2; // == 10

Конечно, не стоит писать подобные заявления. Случай здесь немного сконструирован просто для того, чтобы продемонстрировать, что именно мочь это произойдет, если вы злоупотребляете операторами постинкремента/декремента.