为什么Clang会发出警告:`'||'内部的'&&'`?

45

我理解括号没有区别,那么除了“提高”代码清晰度之外,Clang 默认警告的原因是什么呢?我不喜欢为了写而写,所以宁愿不加括号。

src/websocket.c:420:43: warning: '&&' within '||' [-Wlogical-op-parentheses]
        if (rv == 0 && N != 0 || rv == -1 && errno == ECONNRESET) {
                              ~~ ~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
src/websocket.c:420:43: note: place parentheses around the '&&' expression to
      silence this warning
        if (rv == 0 && N != 0 || rv == -1 && errno == ECONNRESET) {
                                 ~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~

36
为了更加清晰明了,加上一些代码怎么样?在这里加上括号会帮助那些不记得 &&|| 优先级规则(并不经常出现)的人。 - cHao
16
我完全赞成添加代码以提高清晰度。然而,个人认为,不必要的括号会增加视觉噪音,降低了代码的清晰度。当我看到额外的括号时,我立即扫描整个行,寻找它们存在的原因,当我发现没有时,我就必须花一段时间思考是否我读错了或者这段代码只是想“帮助”我理解操作符优先级,而我已经知道了它。这段代码绝对不适合没有经验的程序员,大部分阅读它的人都和我一样有经验,因此我认为他们也会有同样的感觉。 - mxcl
8
编译器也会警告 if (x = 3) 这样的语句,虽然它是合法的。关键在于这种写法常常会引发人们的错误,因此编译器的开发者认为值得发出警告。 - Daniel Fischer
16
我总是修复警告,而且觉得有些荒谬的是有人主张我添加不必要的代码来帮助那些未能学会重要知识如运算符优先级的人。如果我雇用这样糟糕的程序员,天哪可怕。 - mxcl
27
为什么每个人都这么激烈地为这个警告辩护?如果编译器每次你说“2 + 3 * 4”都发出警告,你会有什么感觉?这简直是荒谬的。假定程序员对他们正在使用的语言有基本的理解,不需要通过视觉上的杂乱来理解优先级。另外,Xcode似乎没有提供默认禁用此选项的选项... - Philip Guin
显示剩余10条评论
2个回答

33

自然倾向于从左到右阅读,很容易忘记运算符的优先级。话虽如此,这只是一个警告,如果你知道自己在做什么并且你自己的风格允许,可以随意忽略它。


22
如果想要抑制它,可以在您的构建系统的CFLAGS中添加“-Wno-logical-op-parentheses”。 - mxcl

27
我猜这是因为它有点不太清楚,除非读者非常擅长于C的运算符优先级规则

你的表达式如下:

if (A && B || C && D)

由于 && 的优先级高于 ||,这意味着
if ((A && B) || (C && D))

我想这就是你的意思,但阅读起来并不是很清晰。

55
依我之见,任何学过基础逻辑的人都应该记得,在数学中,“与”比“或”优先级更高。我认为编译器在这里有点过于谨慎。(即,这绝对不是与“if (a = 0)”相同的情况。) - user529758
35
完全同意 - 这是我见过的最无用的警告。为什么它允许写1+23而不建议更改为1+(23)? - Alexander Kirillin
12
可能是因为在现实世界中,大多数编码人员都非常确定1+2*3会做什么,而他们中的大多数人不确定a && b || c && d会做什么。 - Drax
3
如果 &&|| 没有被重载,那么 A && B || C && D 的解释更像是 if (A && B) { return true; } else if (C && D) { return true; } else { return false; }。说 && 拥有更高的优先级 有点 暗示着 C && D 会在 || 之前被计算,但我的现有理解是一个更准确的翻译应该是 A && (B || (C && D))。当然,这种区别只对微观优化相关。无论如何,这个警告最重要的结论是 A && (B || C) && D 是一种错误的解释。 - M-Pixel
2
@M-Pixel A && (B || (C && D))甚至不等价。只要A为false,它就会评估为false,而原始的表达式只要CD都为true,它就是true。 - Imperishable Night
哎呀,你说得对。 - M-Pixel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接