运算符优先级和关联性并不能告诉您之前发生了什么,之后发生了什么。运算符优先级/关联性与它无关。在 C 语言中,诸如“之前”或“之后”之类的时间关系由所谓的序列点定义,并且仅由序列点定义(这是一个完全独立的故事)。
运算符优先级/关联性只是告诉您哪些操作数属于哪些运算符。例如,表达式a = b++
可以正式解释为(a = b)++
和a = (b++)
。运算符优先级/关联性在这种情况下只是告诉您后一种解释是正确的,而前者是不正确的(即++
适用于b
而不适用于 的结果a = b
)。
再一次,这并不意味着b
应该首先增加。再一次,运算符优先级/关联性与“首先”发生的事情和“接下来”发生的事情有关。它只是告诉您b++
表达式的结果被分配给a
. 根据定义,b++
(后缀增量)的结果是 的原始值b
。这就是为什么a
会得到 的原始值b
,即 1。变量b
何时递增完全无关紧要,只要a
获得b
的原始值即可。允许编译器以任何顺序评估此表达式并随时递增b
:任何事情都会发生,只要a
以某种方式获得的原始价值b
(并且没有人真正关心“以某种方式”在内部如何工作)。
例如,编译器可以评估a = b++
为以下基本操作序列
(1) a := b
(2) b := b + 1
或者它可以如下评估它
(1) b := b + 1
(2) a = b - 1
请注意,在第一种情况下b
实际上在末尾递增,而在第二种情况下b
首先递增。但在这两种情况下,a
都会得到相同的正确值 - 的原始值b
,这是它应该得到的。
但我必须重申,以上两个例子只是为了说明目的。实际上,表达式 likea = ++b
和a = b++
内部没有序列点,这意味着从您的角度来看,这些表达式中的所有内容都是同时发生的。没有“之前”、“之后”、“第一个”、“下一个”或“最后一个”。从某种意义上说,这样的表达式是“原子的”,它们不能有意义地分解成一系列更小的步骤。