我正在尝试确定评估的顺序。我真的不明白评估的顺序。评估它的操作数,子表达式,表达式还是什么?
[我试图进行一些研究,并研究gcc和vc编译器之间的区别,但是在花费大量时间进行这项研究之后,我仍然不知道评估的顺序。
让我们举个例子:
-----------------第一个示例-----------------
int i = 1, j;
j = (i = 5) + (i = 6);
gcc和Visual Studio结果:j = 12
我认为评估顺序在这里如何工作(看起来像从左到右):
首先计算操作数j->此变量中有一些随机数。
j = (i = 5) + (i = 6);
然后对操作数i求值-> i(值为1)
j = (i = 5) + (i = 6);
然后被评估为常数5-> 5
j = (i = 5) + (i = 6);
然后评估整个子表达式(i = 5)-> i(值为5)
j = (i) + (i = 6);
然后计算操作数i-> i(值为5)
j = (i) + (i = 6);
然后被评估为常数6-> 6
j = (i) + (i = 6);
然后评估整个子表达式(i = 6)-> i(值为6)
j = (i) + (i);
经过所有评估之后,优先级和关联性就到了,一切都在计算。
(j = ((i) + (i)));
-> (j = ((6) + (6)));
-> j = 12
-----------------第二个示例-----------------
int x = 1, y = 2, z = 5;
x = (y = 3, (z = ++y + 2) + 5);
gcc和Visual Studio结果:x = 11
我认为评估顺序在这里如何工作(看起来从左到右):
第一个被求值的操作数x-> x(值为1)
x = (y = 3, (z = ++y + 2) + 5);
(y = 3, (z = ++y + 2) + 5)
。另外逗号表示y = 3
必须在(z = ++y + 2) + 5
因此,求出的操作数为y-> y(值为2)
x = (y = 3, (z = ++y + 2) + 5);
然后求值为常数3-> 3
x = (y = 3, (z = ++y + 2) + 5);
然后求值的是整个子表达式(y = 3)-> y(值为3)
x = (y, (z = ++y + 2) + 5);
!!!这很奇怪,因为根据示例y = 3不是子表达式
然后求值的是操作数z-> z(值为5)
x = (y, (z = ++y + 2) + 5);
然后求值为操作数(或子表达式,IDK是它)++ y-> y(值为4)
x = (y, (z = ++y + 2) + 5);
然后求值为常数2-> 2
x = (y, (z = ++y + 2) + 5);
然后求值为整个子表达式(z = ++ y + 2)-> z(值为6)
x = (y, (z) + 5);
然后求值为常数5-> 5
x = (y, (z) + 5);
然后求值为整个子表达式(y = 3,(z = ++ y + 2)+ 5)-> 11
x = (11);
经过所有评估之后,优先级和关联性就到了,一切都在计算。
(x = (11)); -> x = 11
-----------------第三示例-----------------
int x = 1, y = 2, z = 5;
x = (y = 3) + (y = 3) + (y = 5);
gcc结果:x = 11
Visual Studio结果:x = 15
此示例的此“说明”将很快。...
我认为gcc的评估顺序在这里如何工作(看起来从左到右):
我认为gcc保存值而不是变量,但为什么呢???
x = (y = 3) + (y = 3) + (y = 5);
x = (3) + (3) + (5); //saves value instead of variable?????
x = 15
我认为视觉工作室的评估顺序在这里如何工作(看起来从左到右):
x = (y = 3) + (y = 3) + (y = 5);
x = (y) + (y) + (y); //Last value of y was 5, so......
x = 5 + 5 + 5
x = 15
所以一切都让我感到困惑,这是非常糟糕的研究,因为我不理解。
所以我问你:
什么评估顺序?操作数,子表达式,表达式还是什么?如果全部,是否在子表达式之前评估操作数,在表达式之前评估子表达式?
与优先级和关联性有关的评估顺序(可能对于某些编译器而言)
优先级和关联性之前或之后的评估顺序是吗?
为什么有时(如第三个示例)看起来像编译器保存值而不是变量?同样这可能是错误的,因为它可以保存完全不同的内容,大声笑....
据我说,我完全错了我写的东西-这没有任何意义。
预先感谢您的回答
我正在尝试确定评估的顺序。我真的不明白评估的顺序。评估它的操作数,子表达式,表达式还是什么?我正在尝试做一些...
您的教科书行为不确定。
此: