V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
learningman
V2EX  ›  C

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

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

    代码:

    #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 老师敢出这样的题你直接把考卷摔老师脸上
    enchilada2020
        4
    enchilada2020  
       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 进行评估后已经足以得出完整表达式的最终值了。非要运算右侧会被人喷的,浪费资源不环保,:)
    enchilada2020
        10
    enchilada2020  
       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
    运算符优先级是指该运算符优先结合,而不是该运算符优先执行

    这是一个非常正常的 && 操作符短路特性
    enchilada2020
        16
    enchilada2020  
       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
    简称:优化
    111qqz
        20
    111qqz  
       2020-02-07 01:17:57 +08:00 via Android
    运算符优先级优先的是结合的顺序,并不是数值的顺序。大多数运算的求值顺序都是不确定的,貌似确定的只有 && ,||,问号运算符和逗号运算符的求值顺序是确定的
    111qqz
        21
    111qqz  
       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  
       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   ·   实用小工具   ·   2364 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 48ms · UTC 01:52 · PVG 09:52 · LAX 17:52 · JFK 20:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.