估计你是谭浩强的受害者,“优先级”“评估顺序”是两个完全无关的概念,虽然这两个概念常常需要联合运用。
同时,“表达式评估值”与“副作用”也是两个不相干的概念,谭浩强把它们混在一起。
先说“优先级”,你的 ++a==b-- 根据优先级应当看成是 (++a) == (b--),而非 ++((a==b)--)、((++a)==b)-- 等等,这就是“优先级”的作用,优先级确保表达式无二义;
除了“优先级”,其实还有一个“结合性”是联合在一起使用的。比如 ++a++, 两个++的优先级一样,是看成 (++a)++ 还是 ++(a++)? 这时就由“结合性”说了算。
先评估“++a”,还是“b--”?在这里C规定它们之间无评估先后顺序;而 a=5,b=6,++a==b-- 则有规定先评估“a=5”再评估“b=6”
对于“表达式评估值”与“副作用”,比如 ++a, 谭浩强说先++等的,则完全错误了,“a自增1 这个副作用”完全可以发生在“++a 这个表达式评估”之后。
还是以你的“a=5,b=6 ,++a==b--”为例,当评估“++a”时,获得了“++a”这个表达式的值6,但a仍然可能还是5;当评估“b--”时,获得了“b--”这个表达式的值6,但b可能早先就变成了5。
估计你听得有点儿绕了,简单的说,++a == b-- 中是 "++a" 与 "b--" 这两个表达式进行比较,而非 a 与 b 进行比较。
++a 的评估值是等同于 原先a+1 的值,副作用是 a自增了1,但副作用只需要在下一个序列点前完成就行
b-- 的评估值是等同于 原先b 的值,副作用是 b自减了1,但副作用只需要在下一个序列点前完成就行