DM23 Ответов: 2

Как работает приоритет операторов? Для приведенного ниже кода почему значение j равно 22?


 #include<stdio.h>
int main(){
    int i=5,j;
    j= ++i + ++i + ++i;
    printf("%d %d",i,j);
    return 0;
}
why value of j is 22 


Что я уже пробовал:

why value of j is 22 
, мои расчеты говорят 21

Graeme_Grant

Вы уверены? Я получаю результат 21.

[no name]

Я получаю 24 в visual studio 2013

Graeme_Grant

ха... Я запустил его в VS2015

[no name]

Вывод будет зависеть от компилятора.

Graeme_Grant

очень похоже на то.

[no name]

Потому что оператор инкремента имеет приоритет над оператором сложения.

DM23

Можете ли вы объяснить, какой логический компилятор (gcc) использует для вывода j как 22?

[no name]

Да, он использует любую логику, какую захочет.

2 Ответов

Рейтинг:
2

OriginalGriff

В принципе, не делайте этого.
Проблема (особенно с более старыми языками, такими как с) заключается в том, что точный порядок, в котором "вещи происходят", не определяется языком.
В результате компилятор может свободно выполнять операции до и после инкремента и декремента по своему усмотрению - что не обязательно означает "немедленно" - вполне возможно, что они выполняются до, во время или после выполнения строки.
Когда вы добавляете, что компилятор волен оценивать свое выражение либо слева направо, либо справа налево (если только это не вынуждено правилами приоритета), и то, какое значение вы получаете, не будет определено или даже согласовано между двумя компиляторами, или даже двумя версиями одного и того же компилятора, или еще хуже: различно в зависимости от оптимизации!

И это Пита для чтения, а значит, ее трудно понять и поддерживать: разделите ее на разные строки, и пусть оптимизатор разберется!


Рейтинг:
0

Patrice T

Цитата:
Как работает приоритет операторов?

Это не проблема приоритета.
Цитата:
Для приведенного ниже кода почему значение j равно 22?

Этот код может дать j любое значение между 18 и 24. Это просто зависит от используемого вами компилятора. Компилятор C может переписать ваш код, если он считает, что он лучше, эффективнее.
Это серая зона, непредсказуемая.