C语言进阶:15、逻辑运算符比较

逻辑运算符&&、||和!真的很简单吗?

下面程序的输出是什么?

int i=0; j=0; k=0;

++i||++j&&++k;

#include <stdio.h>

int main()
{
    int i=0; 
    int j=0; 
    int k=0;
    
    int s = 0;

    s = ++i||++j&&++k;
    
	printf("i = %d\n", i);
	printf("j = %d\n", j);
	printf("k = %d\n", k);
	
	printf("s = %d\n", s);
	
	return 0;
}

在Linux下使用GCC编译运行:

i = 1
j = 0
k = 0
s = 1

逻辑运算符中,存在一个“短路的概念。

          ||:从左往右计算,遇到第一个为真的条件时,停止运算,整个表达式为真,所有条件为假时表达式为假。

          &&:从左往右运算,遇到第一个为假的条件则停止计算,表达式为假;所有条件为真时表达式才为真。

逻辑表达式中,&&比||具有更高的优先级,所以最后进行||运算,所以上面的逻辑运算等价为:

++i||++j&&++k    ==>> 	(++i) || (++j&&++k)    ==>>>  (true && ++i) || (++j&&++k)

即,在&&和||混合运算时,整个表达式被看做||表达式,编译器从左往右开始计算&&表达式,当某个&&表达式的值为真时,停止计算,整个表达式的值为真。

观察下面代码,判断输出:

#include <stdio.h>

int g=0;

int f()
{
    printf("Func f() is running.\n");
    
    return g++;
}

int main()
{
    if( g || f() && f() )
    {
        printf("In if statement.\n");    
    }
    
    printf("In main(): %d\n", g);
	
	return 0;
}
g || f() && f()   -->  (true && g) || (f() && f())

所以输出为:

Func f() is running.
In main(): 1

逻辑!究竟是什么呢?

观察下面代码,判断输出:

int main()
{   
    printf("%d\n", !0);
        printf("%d\n", !1);
            printf("%d\n", !100);
                printf("%d\n", !-1000);
	
	return 0;
}
值得注意的是,逻辑!只认得0,只知道见到了0就返回1,因此当遇到其他不是0的值时,直接返回0。

所以上述代码的运行结果为:

1
0
0
0

小结:程序中的逻辑表达式遵循短路规则;

        在&&和||混合运算中,整个表达式被看做||表达式,从左往右开始计算&&(可进行转换),最后运算||表达式。

        逻辑非!运算符只认得0,遇见0返回1,否则直接返回0.

猜你喜欢

转载自blog.csdn.net/qq_28388835/article/details/80196012