逻辑与和逻辑或(多个逻辑与和逻辑或)

逻辑与和逻辑或

  说到逻辑与和逻辑或大家觉得肯定很简单,无非就是真假两种情况,可是有时候多个逻辑与或者逻辑或在一起是怎么分析。
  只要抓住&&和||可以控制求值顺序就好办了
  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

总结一下:
  如果多个逻辑与或者逻辑或在一起时;对于逻辑与,一步一步往后看,如果你判断到哪一步为假时,到此结束,后面无需再判断,后面的表达式也不会参与运算,如果是真,还要继续看;对于逻辑或,一步一步往后看,如果你判断到哪一步为真,后面无需再判断,后面的表达式也不会参与运算,如果是假,还要继续判断。

你可能感兴趣的:(C语言)