运算符优先级和关联性并不能告诉您之前发生了什么,之后发生了什么。运算符优先级/关联性与它无关。在 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++内部没有序列点,这意味着从您的角度来看,这些表达式中的所有内容都是同时发生的。没有“之前”、“之后”、“第一个”、“下一个”或“最后一个”。从某种意义上说,这样的表达式是“原子的”,它们不能有意义地分解成一系列更小的步骤。