2010-08-17 2 views
0

Можно создать дубликат:
Could anyone explain these undefined behaviors (i = i++ + ++i , i = i++, etc…)ввода в C Puzzler

int main() 
{ 
int a=5,s; 
s=++a + ++a; 
printf("%d",a); 
printf("%d",s); 
} 

выход 7 и 14

НО

int main() 
{ 
int a, s; 
printf("Enter value of a"); 
scanf ("%d",&a); 
s=++a + ++a; 
printf("%d",a); 
printf("%d",s); 
} 

ввод данных пользователя составляет 5 Выход 7 и 13

ПОЧЕМУ?

+0

Я вижу '714' для 2-го примера тоже: http://ideone.com/vJbaH – Blindy

+0

Есть так много дубликатов это на SO. Например: http://stackoverflow.com/questions/2902638/post-and-pre-increment-in-c или http://stackoverflow.com/questions/949433/could-anyone-explain-these-undefined-behaviors -iiiii-etc – Naveen

+0

какой компилятор C вы используете? –

ответ

3

Неопределенное поведение:

s=++a + ++a; 

Все может произойти, если не определено, поэтому ваше поведение вполне допустимо.

+0

Отсутствует точка. – Blindy

+1

@ Блинди: Возможно, вы могли бы объяснить, в точности, какой смысл отсутствует. –

+0

У него отсутствует точка, что независимо от этой строки обе версии OP кода должны (и делать) возвращать то же самое в одном компиляторе. Вот об этом и идет речь. – Blindy

1

Я подозреваю, что это артефакт оптимизации компилятора, в первом примере a известен, поэтому компилятор оптимизирует предварительные предписания, которые должны произойти перед добавлением. Во втором примере значение неизвестно, и компилятор не оптимизирует последовательность, заставляя ее закончить влево-вправо. Это может быть функцией вашего конкретного компилятора, и это нужно будет рассмотреть конкретно.

1

Неопределенное поведение. Измените его, или вы рискуете подвергнуться нападению хищников.

0

привет Буды это кодирование работает правильно в VI компиляторе ..

Смежные вопросы