1、逻辑与&&和逻辑或 ||
首先看一个程序
#include <stdio.h>
int main()
{
int i = 0;
int j = 0;
int k = 0;
++i || ++j && ++k;
printf("%d\n", i); //1
printf("%d\n", j); //0
printf("%d\n", k); //0
return 0;
}
易错点:因为很多人会觉得&& 运算的优先级是要比 || 要高的,所以很多人会先对后半部分先进行运算,导致得出结论:i= 0,j = 1,k = 1。
短路规则:
—— || 从左向右开始计算
当遇到真时立即停止计算,整个表达式为真;当所有表达式都为假时,才为假。
—— && 从左向右开始计算
当遇到假的条件时停止计算,整个表达式为假;当所有表达式都为真时,才为假。
所以,上面分析错误的原因在于它没有遵循短路规则里面的从左向右开始计算。应该先计算 || 的表达式,左边为真,右边可以不进行计算,所以i= 1,j = 0,k = 0 。
对于&&和 || 的混合运算,
—— 整个表达式被看做 || 表达式
—— 从左向右开始计算&&表达式
—— 最后计算 || 表达式
++i || ++j && ++k 可以转换成(true&&++i)||(++j && ++k ),当前面的表达式为真时,后面的表达式可以不用计算。
在此纠正一下:&& 运算的优先级是要比 || 要高,并不是两个一起混合运算先算&&,而是先把他们转化为 || 表达式,在这个基础上先算&&。
2、逻辑非 !
遇 0 返回 1,否则统统返回 0