2016-09-25 3 views
0

Я только что начал на C++, поэтому не уверен в порядке оценки. В приведенном ниже сегменте кода, как вы видите, изменение порядка оценки при оценке C дает мне разные результаты, когда я оцениваю C * (line-i)/i, он дает мне -131213633 и когда я оцениваю его как (line- i)/i * C, он дает мне 145422675. В первом случае я понимаю, что это проблема переполнения, но я хочу понять порядок оценки.Порядок оценки в C++

C = C * (line - i)/i ; 
(gdb) p line 
$1 = 31 
(gdb) p i 
$2 = 15 
(gdb) p C 
$3 = 145422675 
(gdb) p C * (line - i)/i 
$4 = -131213633 
(gdb) p (line - i)/i * C 
$5 = 145422675 
+0

http://en.cppreference.com/w/cpp/language/eval_order помечен как вне темы – Danh

+0

Вы не знаете, что такое оценка оценки, или вы не знаете, почему это имеет значение? –

+0

@ VaughnCato он заявил, что знает, что произошло переполнение. – Danh

ответ

0

Оба * и / адъюнкт влево, так что выражения вычисляются слева направо.

C * (line - i) (т. Е. C * 16) переполнение.
(line - i)/i является 1, и 1 * C не переполняется.

0
cout<< 3/2 *2; // Prints 2 
cout<< 2*3/2; // Prints 3 

В первой строке, 3/2 вычисляется в 1.5, который является целым числом 1. Который затем умножается на 2 дает 2.

Во второй строке, умножение выполняется первым, 2 * 3 составляет 6, что делится на 2 дает 3.

Таким образом, при смешении целочисленной и двойной арифметики порядок оценки имеет значение.

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