2013-04-22 11 views
-8

Что будет выход кодаЧто такое вывод следующего кода?

int a=3,b=4;
++a*=++b;
cout<<a<<endl;

компилятор показывает a=20 output.How precedence и operator associativity используется здесь?

Что я понимаю:

первый b слева от ++a*=++b; увеличивается нам его оператор unary затем приходит поворот *= так выражение становится ++a = a * ++b; как a=3 и b=5 теперь так становится 15 тогда 15 является присваивается a и увеличивается. Окончательно получив 16, но компилятор дает 20

+2

Ваше понимание неверно. Ваш код изменяет 'a' * дважды * без промежуточной * точки последовательности *. Поэтому ваш код имеет * неопределенное поведение *. См. Ссылку cHao для подробного объяснения. – john

+1

@john - это формальный способ сказать, что компилятор не должен иметь дело с этим типом ****. –

+0

Это неопределенное поведение из-за отсутствия точек последовательности. Правдоподобно, что 4 * 5 = 20; однако вы не знаете, каким будет результат ++ a, поэтому он не определен. – 2013-04-22 21:18:36

ответ

1

В вашей части r на вашем конкретном компиляторе, кажется, что сначала a увеличивается на 4, а b увеличивается на 5, тогда выполняется a * = b, а a становится 20 (4 * 5). Однако другой компилятор может дать другой результат, потому что это не определенное поведение, как люди, упомянутые в комментариях

+0

Это правдоподобное объяснение наблюдаемого поведения. В общем, поведение не определено. –

+0

В стандартах для C и C++ явно указано, что поведение не определено, когда вы дважды изменяете один и тот же объект без промежуточной точки. То, что математика получается, ничего не значит; он может работать совершенно иначе с другим компилятором или между прогонами одной и той же программы ... или, технически, поджечь ваш компьютер. – cHao

+0

Я думал, что ++ an и ++ b всегда будут происходить до умножения, это неправильно? – Martinsos

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