learningman
V2EX  ›  C

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

  •  2
     
  •   learningman · Feb 6, 2020 · 4750 views
    This topic created in 2472 days ago, the information mentioned may be changed or developed.

    代码:

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

    输出得到0

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

    34 replies  •  2020-02-08 01:10:06 +08:00
    muzuiget
    muzuiget
    Feb 6, 2020❤️9
    1
    建议不要纠结这种问题,在实际工作中毫无意义,写成这样还会被打。

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

    这是一个非常正常的 && 操作符短路特性
    KMpAn8Obw1QhPoEP
    KMpAn8Obw1QhPoEP
    Feb 6, 2020 via Android❤️1
    16
    @learningman 15L 的解释足够清楚了:)
    mxalbert1996
    mxalbert1996
    Feb 6, 2020❤️1
    17
    内建运算符 && 和 || 进行短路求值(若在求值第一个操作数后结果已知,则不求值第二个),但重载的运算符表现类似函数调用,并始终对两个操作数都进行求值。
    zh.cppreference.com/w/cpp/language/operator_logical
    vkhsyj
    vkhsyj
    Feb 6, 2020❤️1
    18
    短路求值,沙雕学校喜欢考这种东西
    ExplorerLog
    ExplorerLog
    Feb 6, 2020
    19
    简称:优化
    midasplus
    midasplus
    Feb 7, 2020 via Android
    20
    运算符优先级优先的是结合的顺序,并不是数值的顺序。大多数运算的求值顺序都是不确定的,貌似确定的只有 && ,||,问号运算符和逗号运算符的求值顺序是确定的
    midasplus
    midasplus
    Feb 7, 2020 via Android
    21
    @111qqz 语病了。。 凑活着看吧
    nvkou
    nvkou
    Feb 7, 2020 via Android
    22
    该不会还在用谭浩强吧
    leido
    leido
    Feb 7, 2020 via Android
    23
    一看就是短路求值啊
    jeenysem
    jeenysem
    Feb 7, 2020 via Android❤️1
    24
    a == 0,所以表达式 a&&++a 结果为 false,++a 没有执行。
    BingZ
    BingZ
    Feb 7, 2020❤️1
    25
    学校再敢这么出题,真是要再毁下一代码农啊?那么多好的思想概念不去深究,老是搞这些糟粕,哎。
    程序写出来还是要给人看的,这是学校最应该教的。
    fuchunliu
    fuchunliu
    Feb 7, 2020 via Android❤️1
    26
    不确定的情况请用括号
    bruce00
    bruce00
    Feb 7, 2020
    27
    昨天刚好看到这章,C 语言程序设计(第三版)(苏小红)第 81 页,“注意,运算符 && 和 || 都具有‘短路’特性”,既然是特性。。。emmmmm
    sumarker
    sumarker
    Feb 7, 2020
    28
    并不实用
    其实我也不会
    建议分行并加括号
    52coder
    52coder
    Feb 7, 2020
    29
    a==0,&&的结果一定为 0,不会往后走了,不涉及优先级问题,&&就是要先计算左边。
    inhzus
    inhzus
    Feb 7, 2020 via Android
    30
    等价于 if(!a) ++a;
    learningman
    learningman
    OP
    Feb 7, 2020 via Android
    31
    @nvkou C Primer Plus
    learningman
    learningman
    OP
    Feb 7, 2020 via Android
    32
    @nvkou 学校发的确实是谭浩强。。。
    lance6716
    lance6716
    Feb 7, 2020
    33
    这个&&用他的短路特性,还不算偏吧,好多场景都这么用
    xFrye
    xFrye
    Feb 8, 2020
    34
    你问老师出这种题目的意义是什么。。 括号这么好用的运算符不用
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2140 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 103ms · UTC 07:38 · PVG 15:38 · LAX 23:38 · JFK 02:38
    ♥ Do have faith in what you're doing.