这是一个检查运算符优先级和断路问题的
断路是指,&& 或者||操作中,如果出现某种情况,不再执行 && 或者||之后的运算
如:
a=1; b=-1;
if ( a>0 || b++ < 0 )
这个if就会产生断路,即:a>0为真,||操作是有一个为真就为真,因此,不会再操作b++ < 0的运算
运算符中,赋值操作符的优先级是最低的 = += /= -= *=等都是赋值运算符
m=a++>=3&&++b
先运算 a++ >= 3 a=2时,a<=3是假,a=a+1=3
有一个为假,&&运算就为假,这里断路了,不会再执行++b
接着完成赋值m=假=0
因此,a=3(自增1),b=5(没变化),m=0
a++运行时返回的是2,但是2小于3,所以逻辑与式子的前面判断为错误,因此后半部分不执行
所以++b这部分被省略了,没有执行
而a在自加之后加1
b不变
=是赋值运算符,是运算级别最低,因为&&逻辑与的左边等于0了,所以整个式子是0
所以m=0
1.判断a>=3是否成立
2.a自增
3.根据&&之前的结果执行&&之后
如果第一步成立,才会继续&&后面的判断++b,否则就不会执行到&&后面。题设第一步就是不成立的
而第二步a自增是紧跟第一步,在&&之前的
所以a=3,b=5,m=0(条件判断不成立返回0)
m=a++>=3&&++b
等效为:m=1&&1(0)
m=0&&1(0)
意思也就是让你判断"a++>=3"为真(值为1)还是假(值为0)然后与“&&”右边的式子真假相与最后结果赋值给m。
这样你就可以明白了
只能说逻辑表达式有短路说法。这个和就不要太较真。
应该说好的程序员就不该把表达式写成这样。这样想除了不好理解外,没有任何作用。
好的程序员会把程序写的一目了然。
我是比较倡导养成好的编程习惯,编写优质代码。