Вывод нескольких почтовых и предварительных приращений в одном выражении

Я новичок в языке 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