一个关于 C 语言中运算符优先级的小问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
learningman
V2EX    C

一个关于 C 语言中运算符优先级的小问题

  •  2
     
  •   learningman 2020-02-06 21:31:10 +08:00 3924 次点击
    这是一个创建于 2152 天前的主题,其中的信息可能已经有所发展或是发生改变。

    代码:

    #include "bits/stdc++.h" using namespace std; int main() { int a=0; a&&++a; cout<<a<<endl; } 

    输出得到0

    但是运算符++的优先级不应该高于&&吗,为什么先判断了&&,导致 a 的数值没有改变?

    34 条回复    2020-02-08 01:10:06 +08:00
    muzuiget
        1
    muzuiget  
       2020-02-06 21:33:01 +08:00   9
    建议不要纠结这种问题,在实际工作中毫无意义,写成这样还会被打。

    问题回答:我也不知道。
    learningman
        2
    learningman  
    OP
       2020-02-06 21:33:37 +08:00
    @muzuiget 但是期末考试会考。。。
    phpfpm
        3
    phpfpm  
       2020-02-06 21:35:22 +08:00   1
    @learningman 老师敢出这样的题你直接把考卷摔老师脸上
    KMpAn8Obw1QhPoEP
        4
    KMpAn8Obw1QhPoEP  
       2020-02-06 21:37:20 +08:00 via Android   2
    只记得&&运算符遇到左边算子是 0 时自动短路不计算右边的值。。同意 1L 说法
    McZoden
        5
    McZoden  
       2020-02-06 21:37:55 +08:00
    a = 0 后,判断语句一定是 false,&& 右侧就不需要再判断了,所以也不会执行,我是这么猜的
    learningman
        6
    learningman  
    OP
       2020-02-06 21:38:13 +08:00
    @phpfpm 去年已经出过了。。。不具备可操作意义
    learningman
        7
    learningman  
    OP
       2020-02-06 21:38:56 +08:00
    @enchilada2020 &&本身作为一个逻辑运算符,为什么先执行短路原则呢?++的优先级更高
    Nasei
        8
    Nasei  
       2020-02-06 21:40:07 +08:00 via Android
    短路
    dandycheung
        9
    dandycheung  
       2020-02-06 21:44:34 +08:00 via iPhone   1
    @learningman 因为那行语句本身的目的是求一个逻辑表达式的值,左侧的 a 进行评估后已经足以得出完整表达式的最终值了。非要运算右侧会被人喷的,浪费资源不环保,:)
    KMpAn8Obw1QhPoEP
        10
    KMpAn8Obw1QhPoEP  
       2020-02-06 21:46:52 +08:00 via Android   1
    @learningman 破案了 这是属于概念混淆 运算优先级不等于求值顺序 而 && 的求值顺序是先左后右 先左发现是 0 则直接短路不求右了
    learningman
        11
    learningman  
    OP
       2020-02-06 21:47:06 +08:00
    @dandycheung 我查到了一句话:优先级与求值顺序无关。
    那么在一个表达式的执行过程中,优先级又做了什么。。。。仅仅只负责结合顺序的判断吗
    learningman
        12
    learningman  
    OP
       2020-02-06 21:47:43 +08:00
    @enchilada2020 那么在一个表达式的执行过程中,优先级又做了什么。。。
    bp0
        13
    bp0  
       2020-02-06 21:48:18 +08:00
    ++a 没有执行,原因上面已经说了,短路求值。a == 0,整个语句已经有结果( false ),自然不需要在计算右边的语句了。
    CismonX
        14
    CismonX  
       2020-02-06 21:49:52 +08:00   1
    摘抄自 ISO/IEC 9899:201x 第 6.5.13 节:

    Unlike the bitwise binary & operator, the && operator guarantees left-to-right evaluation;
    if the second operand is evaluated, there is a sequence point between the evaluations of
    the first and second operands. If the first operand compares equal to 0, the second
    operand is not evaluated.

    显然最终 a 的结果是 0
    fcten
        15
    fcten  
       2020-02-06 21:50:22 +08:00   5
    运算符优先级是指该运算符优先结合,而不是该运算符优先执行

    这是一个非常正常的 && 操作符短路特性
    KMpAn8Obw1QhPoEP
        16
    KMpAn8Obw1QhPoEP  
       2020-02-06 21:52:18 +08:00 via Android   1
    @learningman 15L 的解释足够清楚了:)
    mxalbert1996
        17
    mxalbert1996  
       2020-02-06 22:02:29 +08:00   1
    内建运算符 && 和 || 进行短路求值(若在求值第一个操作数后结果已知,则不求值第二个),但重载的运算符表现类似函数调用,并始终对两个操作数都进行求值。
    zh.cppreference.com/w/cpp/language/operator_logical
    vkhsyj
        18
    vkhsyj  
       2020-02-06 22:46:49 +08:00   1
    短路求值,沙雕学校喜欢考这种东西
    ExplorerLog
        19
    ExplorerLog  
       2020-02-06 22:57:20 +08:00
    简称:优化
    midasplus
        20
    midasplus  
       2020-02-07 01:17:57 +08:00 via Android
    运算符优先级优先的是结合的顺序,并不是数值的顺序。大多数运算的求值顺序都是不确定的,貌似确定的只有 && ,||,问号运算符和逗号运算符的求值顺序是确定的
    midasplus
        21
    midasplus  
       2020-02-07 01:19:37 +08:00 via Android
    @111qqz 语病了。。 凑活着看吧
    nvkou
        22
    nvkou  
       2020-02-07 01:58:04 +08:00 via Android
    该不会还在用谭浩强吧
    leido
        23
    leido  
       2020-02-07 03:02:28 +08:00 via Android
    一看就是短路求值啊
    jeenysem
        24
    jeenysem  
       2020-02-07 09:17:57 +08:00 via Android   1
    a == 0,所以表达式 a&&++a 结果为 false,++a 没有执行。
    BingZ
        25
    BingZ  
       2020-02-07 09:19:37 +08:00   1
    学校再敢这么出题,真是要再毁下一代码农啊?那么多好的思想概念不去深究,老是搞这些糟粕,哎。
    程序写出来还是要给人看的,这是学校最应该教的。
    fuchunliu
        26
    fuchunliu  
       2020-02-07 09:32:07 +08:00 via Android   1
    不确定的情况请用括号
    bruce00
        27
    bruce00  
       2020-02-07 10:04:56 +08:00
    昨天刚好看到这章,C 语言程序设计(第三版)(苏小红)第 81 页,“注意,运算符 && 和 || 都具有‘短路’特性”,既然是特性。。。emmmmm
    sumarker
        28
    sumarker  
    PRO
       2020-02-07 10:15:20 +08:00
    并不实用
    其实我也不会
    建议分行并加括号
    52coder
        29
    52coder  
       2020-02-07 10:32:54 +08:00
    a==0,&&的结果一定为 0,不会往后走了,不涉及优先级问题,&&就是要先计算左边。
    inhzus
        30
    inhzus  
       2020-02-07 11:57:31 +08:00 via Android
    等价于 if(!a) ++a;
    learningman
        31
    learningman  
    OP
       2020-02-07 12:16:02 +08:00 via Android
    @nvkou C Primer Plus
    learningman
        32
    learningman  
    OP
       2020-02-07 12:16:17 +08:00 via Android
    @nvkou 学校发的确实是谭浩强。。。
    lance6716
        33
    lance6716  
       2020-02-07 17:36:26 +08:00
    这个&&用他的短路特性,还不算偏吧,好多场景都这么用
    xFrye
        34
    xFrye  
       2020-02-08 01:10:06 +08:00
    你问老师出这种题目的意义是什么。。 括号这么好用的运算符不用
    关于     帮文档     自助推广系统     博客     API     FAQ     Solana     5538 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 06:07 PVG 14:07 LAX 22:07 JFK 01:07
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86