2016-09-25 116 views
0

我刚刚开始使用C++,所以不确定评估的顺序。 在下面的代码段,你可以看到在评估C时改变评估的顺序给了我不同的结果当我评估C *(line-i)/ i时,它给了我-131213633,当我评估它为(line-我)/我* 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 * 16)溢出。
(line - i)/i11 * 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.

所以当混合整数和双算术时,评估的顺序很重要。