评估的顺序是什么?

问题描述 投票:0回答:2

我正在尝试确定评估的顺序。我真的不明白评估的顺序。评估它的操作数,子表达式,表达式还是什么?

[我试图进行一些研究,并研究gcc和vc编译器之间的区别,但是在花费大量时间进行这项研究之后,我仍然不知道评估的顺序。

让我们举个例子:

-----------------第一个示例-----------------

int i = 1, j; j = (i = 5) + (i = 6);

gcc和Visual Studio结果:j = 12

我认为评估顺序在这里如何工作(看起来像从左到右):

  1. 首先计算操作数j->此变量中有一些随机数。

    j = (i = 5) + (i = 6);

  2. 然后对操作数i求值-> i(值为1)

    j = (i = 5) + (i = 6);

  3. 然后被评估为常数5-> 5

    j = (i = 5) + (i = 6);

  4. 然后评估整个子表达式(i = 5)-> i(值为5)

    j = (i) + (i = 6);

  5. 然后计算操作数i-> i(值为5)

    j = (i) + (i = 6);

  6. 然后被评估为常数6-> 6

    j = (i) + (i = 6);

  7. 然后评估整个子表达式(i = 6)-> i(值为6)

    j = (i) + (i);

  8. 经过所有评估之后,优先级和关联性就到了,一切都在计算。

    (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

我认为评估顺序在这里如何工作(看起来从左到右):

  1. 第一个被求值的操作数x-> x(值为1)

    x = (y = 3, (z = ++y + 2) + 5);

  2. 然后应评估子表达式(y = 3, (z = ++y + 2) + 5)。另外逗号表示y = 3必须在(z = ++y + 2) + 5
  3. 之前求值
  4. 因此,求出的操作数为y-> y(值为2)

    x = (y = 3, (z = ++y + 2) + 5);

  5. 然后求值为常数3-> 3

    x = (y = 3, (z = ++y + 2) + 5);

  6. 然后求值的是整个子表达式(y = 3)-> y(值为3)

    x = (y, (z = ++y + 2) + 5);!!!这很奇怪,因为根据示例y = 3不是子表达式

  7. 然后求值的是操作数z-> z(值为5)

    x = (y, (z = ++y + 2) + 5);

  8. 然后求值为操作数(或子表达式,IDK是它)++ y-> y(值为4)

    x = (y, (z = ++y + 2) + 5);

  9. 然后求值为常数2-> 2

    x = (y, (z = ++y + 2) + 5);

  10. 然后求值为整个子表达式(z = ++ y + 2)-> z(值为6)

    x = (y, (z) + 5);

  11. 然后求值为常数5-> 5

    x = (y, (z) + 5);

  12. 然后求值为整个子表达式(y = 3,(z = ++ y + 2)+ 5)-> 11

    x = (11);

  13. 经过所有评估之后,优先级和关联性就到了,一切都在计算。

    (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保存值而不是变量,但为什么呢???

  1. x = (y = 3) + (y = 3) + (y = 5); x = (3) + (3) + (5); //saves value instead of variable????? x = 15

我认为视觉工作室的评估顺序在这里如何工作(看起来从左到右):

  1. x = (y = 3) + (y = 3) + (y = 5); x = (y) + (y) + (y); //Last value of y was 5, so...... x = 5 + 5 + 5 x = 15

所以一切都让我感到困惑,这是非常糟糕的研究,因为我不理解。

所以我问你:

  1. 什么评估顺序?操作数,子表达式,表达式还是什么?如果全部,是否在子表达式之前评估操作数,在表达式之前评估子表达式?

  2. 与优先级和关联性有关的评估顺序(可能对于某些编译器而言)

  3. 优先级和关联性之前或之后的评估顺序是吗?

  4. 为什么有时(如第三个示例)看起来像编译器保存值而不是变量?同样这可能是错误的,因为它可以保存完全不同的内容,大声笑....

  5. 据我说,我完全错了我写的东西-这没有任何意义。

预先感谢您的回答

我正在尝试确定评估的顺序。我真的不明白评估的顺序。评估它的操作数,子表达式,表达式还是什么?我正在尝试做一些...

c expression operator-precedence evaluation associativity
2个回答
0
投票

您的教科书行为不确定。


0
投票

此:

© www.soinside.com 2019 - 2024. All rights reserved.