C语言运算符优先级问题

来源:百度知道 编辑:UC知道 时间:2024/05/15 09:37:43
int a=1;
int b= !a&&++a;

b的值是0,但是a的值为什么还是1啊?++a后是a为2呀?
根据优先级, !> ++ > &&
所以 先算 !a ,再算 ++a; 再算 &&
C语言表达式是根据符号优先级来确定先算哪个吗?

优先级!> ++ > &&
所以 先算 !a ,再算 ++a; 再算 && 不对吗?

注意一下&&这个运算符

这个运算符有如下两个特点:
1.该运算符是左结合的(也就是说运算步骤是从左向右进行)
2.一旦当该运算符的左边的表达式的值为假(值为0)时,就认为整个&&表达式的值为假(0),不继续进行&&右边的表达式的运算了

所以int b= !a&&++a;
先运算!a,发现!a等于0,表达式为假,所以直接将0赋值给b,不再计算右边的++a了

===========================================================
问题补充:C语言表达式是根据符号优先级来确定先算哪个吗?

优先级!> ++ > &&
所以 先算 !a ,再算 ++a; 再算 && 不对吗?
===========================================================
你列的优先级是对的,
但是注意一点:
一旦当&&运算符的左边的表达式的值为假(值为0)时,就认为整个&&表达式的值为假(0),不继续进行&&右边的表达式的运算了。

也就是说,先运算!a,发现为假,随后编译器发现后面有&&运算,所以直接就不判断后面的表达式了。
如果!a为真,随后编译器发现后面有&&运算,还会继续进行后面的表达式的计算,
而且是等表达式计算完毕后,再判断&&的结果,
所以和你的优先级的疑问是不冲突的

嘿嘿!我给你解释哈
这个是&&的缘故,m&&n,当m=0是“形成短路”,意思就是不再执行n,在你的题目里面就是不再执行++a啦!
与此相同的还有||,m||n,当m的值为真时,后面的n也形成短路,也就是不再执行后面的n操作啦!
明白了吗?