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

2020-02-06 21:31:10 +08:00
 learningman

代码:

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

输出得到0

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

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

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

这是一个非常正常的 && 操作符短路特性
enchilada2020
2020-02-06 21:52:18 +08:00
@learningman 15L 的解释足够清楚了:)
mxalbert1996
2020-02-06 22:02:29 +08:00
内建运算符 && 和 || 进行短路求值(若在求值第一个操作数后结果已知,则不求值第二个),但重载的运算符表现类似函数调用,并始终对两个操作数都进行求值。
zh.cppreference.com/w/cpp/language/operator_logical
vkhsyj
2020-02-06 22:46:49 +08:00
短路求值,沙雕学校喜欢考这种东西
ExplorerLog
2020-02-06 22:57:20 +08:00
简称:优化
111qqz
2020-02-07 01:17:57 +08:00
运算符优先级优先的是结合的顺序,并不是数值的顺序。大多数运算的求值顺序都是不确定的,貌似确定的只有 && ,||,问号运算符和逗号运算符的求值顺序是确定的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/642630

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX