注册 登录
编程论坛 C语言论坛

刚学C语言,弱弱的问个问题

谢依凉 发布于 2020-12-09 19:51, 1156 次点击
a=5,b=6 ,++a==b--,
为什么成立,不是++和--的优先级比==高吗?
2 回复
#2
apull2020-12-09 21:49
==是从左到右结合的,

++a和a++也不相同

a=0时
b=++a //++在前,先加后赋值,结果b=1
b=a++ //结果b=0

所以++a==b--的顺序是
是a=a+1,a==b,b=b-1
#3
rjsp2020-12-10 09:07
估计你是谭浩强的受害者,“优先级”“评估顺序”是两个完全无关的概念,虽然这两个概念常常需要联合运用。
同时,“表达式评估值”与“副作用”也是两个不相干的概念,谭浩强把它们混在一起。

先说“优先级”,你的 ++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,但副作用只需要在下一个序列点前完成就行
1