先放例题
答案选C
首先我们要明白
A||B为真,即A、B至少一个为真(即记为1,同理假记为0)
A&&B为真,即A、B都为真(即记为1,同理假记为0)
1和0,对应真假这个是离散数学里面定义的,C语言也适用。
由题j++| | k++即,1 | | 2由于两边都不同时为0,即判断为真,记为1,同时“或”逻辑前面为1发生短路
化简后原式等于 1 && i++,即1 && 1,由于同时不为0,所以判断为真,记为1,且“与”逻辑前面不为0,就不会发生短路
补充说明 自加自减的运算规则(++a, --a, a++, a–)
得到if(1),所以输出printf("%d,%d,%d\n",j,k);
好的难点来了,仔细听
按理说三个都进行自加输出应该是 2,2,3
但是考虑到 | | 的短路特性,k被短路,所以得到结果是2,2,2
总结:
- 多层嵌套里的右侧数值不发生变化
- “或”逻辑前面为1(不为0即可),“与”逻辑前面为0就会发生短路
- 即根据左边已经可以判断得到最终结果,那么右边的代码将不再执行,从而节省一定的性能。
附赠几道例题,用来细品
网络异常,图片无法展示
|
网络异常,图片无法展示
|
图片引自海南大学上课课件
图一是 || 前不为1所以++b&&++c没有被短路,再看++b&&++c,&&前不为0,也没有短路
图二是 || 前为1所以++b&&++c被短路
图三是 || 前为1所以++b&&++c被短路
图四是 || 前不为1所以++b&&++c没有被短路,再看++b&&++c,&&前为0,则c被短路