C 为什么叮当声发出警告:`'&&';在'||';`?

C 为什么叮当声发出警告:`'&&';在'||';`?,c,clang,C,Clang,我的理解是括号没有任何区别,那么有没有任何理由(除了“提高”代码的清晰度)让Clang将此作为默认警告?我不喜欢添加括号,因为我不喜欢为了代码而添加代码 src/websocket.c:420:43: warning: '&&' within '||' [-Wlogical-op-parentheses] if (rv == 0 && N != 0 || rv == -1 && errno == ECONNRESET) {

我的理解是括号没有任何区别,那么有没有任何理由(除了“提高”代码的清晰度)让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) {
                                 ~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~

自然的趋势是从左到右阅读,很容易忘记运算符优先级。也就是说,这只是一个警告,如果你知道你在做什么,并且你自己的风格允许,可以随意抑制它。

我猜是因为它只是有点不清楚,除非读者非常擅长

你的表情是这样的:

if (A && B || C && D)
由于
&&
| |
具有更高的优先性,它意味着

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

我猜这就是你的意思,但阅读时不太清楚。

对于那些想要抑制它的人,请在构建系统的CFLAGS中附加:
-Wno逻辑运算括号。
为了清晰起见,添加代码如何?这里的括号可以帮助那些不记得
&
优先级规则的人e> | |
(通常不会出现这种情况)。我完全支持添加代码以提高清晰度。然而,我个人发现,在这种情况下,不必要的括号会产生额外的视觉噪音,从而降低清晰度。当我看到额外的括号时,我会立即扫描整行,寻找原因,当我发现没有括号时,如果我读错了,或者代码不正确,我就必须思考一段时间问题仅仅是试图“帮助”我理解我已经知道的运算符优先级。这段代码绝对不是给没有经验的程序员编写的,大多数阅读它的人都和我一样,所以我想我也会有同样的感觉。@KingsIndian编译器还警告
if(x=3)
,这是完全合法的。问题是,人们认为这是经常出错的事情,所以编译器编写人员认为这值得一提。我也总是修正警告,并且发现人们鼓吹我添加不必要的代码来帮助那些没有学会运算符优先级等重要知识的人是荒谬的。天哪我曾经雇佣过这么糟糕的程序员。为什么每个人都这么激烈地为这个警告辩护?如果每次你说“2+3*4”时编译器都警告你,你会有什么感觉?这太可笑了。假设程序员对他们正在使用的语言有基本的了解,不需要视觉混乱来理解优先级。另一方面,Xcode似乎没有提供默认禁用的选项…我想任何学习过基本逻辑的人都应该记住这一点,在数学中,且优先级高于或。我认为编译器在这里相当偏执。(即,如果(a=0)
完全同意,这绝对不是
的情况-这是我见过的最无用的警告。为什么它允许写1+2*3,而不建议将其改为1+(2*3)?可能是因为在现实世界中,大多数程序员都非常确定
1+2*3
到底做了什么,而他们中的大多数人都不确定
a&b|c&d
会做什么。当
&
|c&d>没有重载时,
a&b|c&d
的解释更像
if(a&b){return true;}else if(C&&D){return true;}else{return false;}
?说
&
具有更高的优先级在某种程度上意味着
C&&D
将在
|
之前进行评估,但我目前的理解是更准确的翻译应该是
a&(B |&&D))
。当然,这种区别只与纳米优化有关。不管怎样,最重要的警告显然是
A&&(B|C)&&D
是一种不正确的解释。