操作数评估顺序和关联性

时间:2012-05-01 22:34:35

标签: operator-precedence

我无法弄清楚两者之间的区别。说你有这些给予:

a[0] = 10
a[1] = 13
a[2] = 17
a[3] = 19
x = 0
y = 3

操作员优先:

++, --  
*, /, % Left Associative  
+, - Left Associative

操作员评估令:
从右到左

根据上述规则,我如何评估下面的表达式?

a[++x] + ++x % 7 % y

据我的教授说,答案是18,但我无法弄清楚原因。从我理解的关联性是顺序相同的优先级运算符被评估和操作数评估顺序是顺序操作数被评估,所以像2%7这样的东西是从左到右操作数评估顺序2和1与操作评估顺序。任何人都可以解释我的教授是如何得到18的答案的吗?

2 个答案:

答案 0 :(得分:2)

优先级和关联性告诉您表达式是如何(隐式)括起来的。然后,评估顺序确定子表达式的评估顺序。

让我们看看这个例子:

a[++x] + ++x % 7 % y

在顶层,有+%作为运营商。 +优先级较低,因此

a[++x] + (++x % 7 % y)

右子表达式有两个%,它是左关联的,因此

a[++x] + ((++x % 7) % y)

现在,从右到左的评估顺序,首先评估((++x % 7) % y)。再次使用从右到左的评估顺序,首先评估y,得到3.然后评估++x % 7。前7,然后++x。后者导致1.那就是1 % 7 = 1。我会把剩下的留给你,因为它是家庭作业。

答案 1 :(得分:1)

你有() + () % 7 % y。根据规则,() % 7... % y之前和() + ...之前进行评估。

++x % 7中,您首先评估++x并获得1和x=11 % 7 = 1
然后,您执行1 % y1 % 3并获得1.
现在你做a[++x] + 1。记住x=1,您会得到a[2] + 1 = 17 + 1 = 18