温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C之逻辑运算符(十四)

发布时间:2020-06-25 18:16:55 来源:网络 阅读:634 作者:上帝之子521 栏目:编程语言

        我们在 C 语言中经常会遇到逻辑运算符。|| 是从左向右开始计算的,当遇到为真的条件时停止计算,整个表达式为真;所有条件为假时表达式才为假。 && 是从左向右开始计算,当遇到为假的条件时停止计算,整个表达式为假;所有条件为真时表达式才为真。

        我们先来看个经常会遇到的笔试题,以此代码进行分析

#include <stdio.h>

int main()
{
    int i = 0;
    int j = 0;
    int k = 0;
    
    ++i || ++j && ++k;

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

        那么在第 9 行,我们经常会认为先执行 && 运算然后进行 || 运算。那么我们想着就是先执行 ++j && ++k,执行完之后 j 和 k 就分别为 1 了,那么整个表达式的值也就为真了。++i 就不执行了,当然 i 就为 0 了,下来我们来看看结果是否如此

C之逻辑运算符(十四)

        结果刚好跟我们分析的相反。那么我们忽略了一个问题,那就是程序中的短路。在逻辑表达式中, && 比 || 具有更高的优先级。在 && 和 || 混合运算时,整个表达式被看做 || 表达式,编译器从左向右开始计算 && 表达式,当某个 && 表达式的值为真时,停止计算,整个表达式的值为真。那么我们的第9行可以这样看:++i || ++j && ++k ==> ++i || (++j && ++k) ==> (true && ++i) || (++j && ++k)。那么这样分析后,++i 就为 1 了,整个表达式的值就为真了。自然也就不会向后执行了,所以结果应该是1、0、0。

        我们再来看一哥示例代码,比较有迷惑性,代码如下

#include <stdio.h>

int g = 0;

int f()
{
    printf("In f()...\n");

    return g++;
}

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

        我们来分析下这个代码,第14行表达式便可以看成 (true && g) || (f() && f()),那么由于 g 为0,前面为假,继续向后执行。这是便调用到 f() 了,便会打印出 In f()... 这条语句,它在内部返回的 g++,就是先返回 0 再进行++操作。由于 f() 已经返回 0 了,所以后面的 && 表达式为假,因而 main 函数中的 if 中的打印语句得不到执行。但是由于上面已经 g++ 了,所以这时 g 的值就为 1 啦。我们来看看编译结果

C之逻辑运算符(十四)

        我们下来来看下这个运算符"!"。C语言中的逻辑非 "!" 只认得0,只知道见了0就返回1,其他就都为0。我们来看下示例代码。

#include <stdio.h>

int main()
{
    printf("%d\n", !0);
    printf("%d\n", !1);
    printf("%d\n", !100);
    printf("%d\n", !-1000);
    
    return 0;
}

        由上面可知,第一个为1,其他全为0。编译后结果如图

C之逻辑运算符(十四)

        结果也确实如此。我们今天学习了逻辑运算符相关的知识,总结如下:1、程序中的逻辑表达式遵从短路规则;2、在 && 与 || 混合运算时:整个表达式被看做 || 表达式;从左向右先计算 && 表达式;最后计算 || 表达式;3、逻辑非 "!" 运算符只认得 0 碰见 0 返回 1,否则则返回1。只有 0 才代表假,其余所有值均代表真后面我们会继续对 C 语言的学习。


         欢迎大家一起来学习 C 语言,可以加我QQ:243343083

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI