Извеждане на множество пост и предварителни увеличения в един оператор

Нов съм в езика C, така че моля, sum1, помогнете ми. Написан C код

int i=3;
printf("%d",++i + ++i);

Complier дава O/P =9. как?


person Brite Roy    schedule 28.09.2010    source източник
comment
защо мислиш, че не дава този резултат?   -  person KevinDTimm    schedule 28.09.2010


Отговори (1)


Резултатите са неопределени. Променяте променлива повече от веднъж в израз (или точка на последователност, за да бъдем по-точни ).

Модифицирането на променлива повече от веднъж между точки на последователност е недефинирано, така че не го правете.

Може да е вашият компилатор, за този конкретен случай решава да оцени ++i + ++i като

  • увеличава последното ++i, което дава 4, оставяйки i да бъде 4
  • увеличете първото ++i, което дава 5, оставяйки i да бъде 5 (тъй като предишната стъпка остави i като 4, увеличавайки го до 5)
  • сумирайте двете стойности, 4 + 5.

Друг компилатор, или ако промените нивото на оптимизация, или ако промените леко кода, може да доведе до различен резултат.

person nos    schedule 28.09.2010
comment
съгласен: Проверих моя gcc 4.1.2 и възстанових стойността 10 (която може да бъде също толкова лесно обяснена като вашата 9) - person KevinDTimm; 28.09.2010
comment
@KevinDTimm, бихте ли обяснили как бихте отчели 10? - person ajay; 25.03.2014
comment
@ajay - да, стандартът казва, че това води до недефинирано поведение. Така че всеки резултат е еднакво (не)валиден. - person KevinDTimm; 25.03.2014
comment
@KevinDTimm Да, това е недефинирано поведение и всичко може да се случи, защото стандартът не налага изискване за внедряването. Просто се чудех за which could be just as easily explained as your 9 част от коментара ви. - person ajay; 26.03.2014