说到逻辑与和逻辑或大家觉得肯定很简单,无非就是真假两种情况,可是有时候多个逻辑与或者逻辑或在一起是怎么分析。
只要抓住&&和||可以控制求值顺序就好办了
c语言0代表假,非0代表真
真 && 真 ——>真(逻辑与只有全为真才为真,其他都为假)
假 || 假 ——> 假(逻辑或只有全为假才为假,其他都为真)
看一下下面这道题结果是多少:
int a = 0, b = 1, c = 2, d = 3;
int k = 0;
k = (a++) && (++b) && (d++);
printf("a = %d b = %d c = %d d = %d\n", a, b, c, d);
int a = 0, b = 1, c = 2, d = 3;
int k = 0;
k = (a++) || (++b) || (d++);
printf("a = %d b = %d c = %d d = %d\n", a, b, c, d);
确定好了吗?答案在后面
再来看一道题
int a = 1, b = 1, c = 2, d = 3;
int k = 0;
k = (a++) && (++b) && (d++);
printf("a = %d b = %d c = %d d = %d\n", a, b, c, d);
int a = 1, b = 1, c = 2, d = 3;
int k = 0;
k = (a++) || (++b) || (d++);
printf("a = %d b = %d c = %d d = %d\n", a, b, c, d);
题到此结束!
现在开始分析(这里我只是提取了题中的一些有用代码)
##第一题
int a = 0, b = 1, c = 2, d = 3;
k = (a++) && (++b) && (d++);
先执行(a++),此处为后置++,那就先判断再++,a被初始化为0,0代表假,假和任何值进行逻辑判断的结果都是假,表达式进行的此就已经结束了,不会再往后运算了,因为后面的表达式无论是真还是假,整个表达式的结果都已经被a确定成假了。a判断完后加一(此时a = 1),然而b和d都没有参加运算,所以b,d值都不变。
最终结果是a = 1,b = 1,c = 2,d = 3
##第二题
int a = 0, b = 1, c = 2, d = 3;
k = (a++) || (++b) || (d++);
1、 先执行(a++),但是此处为后置++,那就先判断再++,a被初始化为0,0代表假,那就继续往后看(此处和第一题不一样,第一题到此就直接结束了,不会往后判断了,因为它为逻辑与,有一个假,则全为假;而这里是逻辑或,虽然第一个为假,但是后面只要有一个为真,表达式就为真了,除非后面的全部为假,表达式结果也就为假了,所以a的假并不能确定整个表达式的真假,还得继续往后看)(a使用完后要加一,a = 1)
2、 看(++b),前置++,先++(b = 2),2为非0,代表真,此时表达式结束,因为无论后面的结果是真还是假,结果都已经被b确定成了真,因为逻辑或有一个为真,则整个全为真。d没有参与运算,d的值不变。
最终结果是a = 1,b = 2,c = 2,d = 3
##第三题
int a = 1, b = 1, c = 2, d = 3;
k = (a++) && (++b) && (d++);
1、(a++)为后置++,先判断真假,再++,a被初始化为1,1代表真,继续往后看,a值先加一(a = 2);(因为第一个真无法确定整个表达式的真假,后面一旦有一个为假,整个表达式都全为假,如果全为真则为真)
2、(++b)为前置++,先加一(b = 2),2非0,代表真,继续往后看(原因同第一步)
3、(d++)为后置++,先判断再++,d被初始化为3,3代表真,此时三个与项都是真,则表达式的结果为真,最后别忘了要给d加一(d = 4)
最终结果是a = 2,b = 2,c = 2,d = 4
##第四题
int a = 1, b = 1, c = 2, d = 3;
k = (a++) || (++b) || (d++);
(a++)为后者++,先看真假再++,a被初始化为1,1代表真,表达式到此结束,整个表达式的结果是真,a要加一(a = 2),后面的b,d不会参与运算。因为这是逻辑或,只要有一个是真,无论其它的是真还是假,表达式的结果都是真。
最终结果是a = 2,b = 1,c = 2,d = 3
总结一下:
如果多个逻辑与或者逻辑或在一起时;对于逻辑与,一步一步往后看,如果你判断到哪一步为假时,到此结束,后面无需再判断,后面的表达式也不会参与运算,如果是真,还要继续看;对于逻辑或,一步一步往后看,如果你判断到哪一步为真,后面无需再判断,后面的表达式也不会参与运算,如果是假,还要继续判断。