1

我很难弄清楚两者之间的区别。假设你有这些给定:

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 的答案的?

4

2 回答 2

2

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

让我们看一下这个例子:

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

在顶层,有+and %as 运算符。+优先级较低,所以

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

右子表达式有两个%,那是左结合的,因此

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

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

于 2012-05-01T22:53:12.733 回答
1

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

++x % 7您首先评估++x并获得 1 和x=1. 1 % 7 = 1.
然后你做1 % y1 % 3得到1。
现在你做a[++x] + 1。记住这一点x=1,你就明白了a[2] + 1 = 17 + 1 = 18

于 2012-05-01T22:53:37.927 回答