为什么Clang警告:''&&'在'||'`中?

mxc*_*xcl 33 c clang

我的理解是括号没有区别,所以有没有任何理由(除了"改善"代码清晰度)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) {
                                 ~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)

Woo*_*ble 26

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

  • 对于那些想要压制它的人,请在构建系统的CFLAGS中附加:`-Wno-logical-op-parentheses`. (15认同)

unw*_*ind 23

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

你的表达是这样的:

if (A && B || C && D)
Run Code Online (Sandbox Code Playgroud)

并且由于&&具有更高的优先级||,这意味着

if ((A && B) || (C && D))
Run Code Online (Sandbox Code Playgroud)

我猜你的意思是什么,但阅读时并不是很清楚.

  • 恕我直言,至少有一点研究基本逻辑的人应该记住,在数学中,AND的优先级高于OR.我认为编译器在这里非常偏执.(例如,这绝对不是`if(a = 0)`的情况.) (37认同)
  • 完全同意 - 这是我见过的最无用的警告.为什么它允许写1 + 2*3并且不建议将其更改为1+(2*3)? (21认同)
  • 可能是因为在现实世界中,大多数程序员都非常确定"1 + 2*3"究竟是什么,而大多数人都不确定"a && b ||"是什么 c && d`会完全正确. (10认同)
  • 但是,当`&&`和`||`没有重载时,不是`A && B || C && D`的解释更类似于`if(A && B){r​​eturn true; }否则,如果(C && D){返回true; } else {返回false;}`?说`&&`具有更高的优先级*有点*意味着`C && D`将在`||`之前进行求值,但是我目前的理解是更准确的翻译应该是`A &&(B ||(C && D))`。当然,这种区别仅与纳米优化有关。无论哪种方式,警告的最重要意义绝对是`A &&(B || C)&& D`是错误的解释。 (2认同)
  • @M-Pixel `A && (B || (C && D))` 甚至不等效。每当“A”为假时,这将评估为假,而只要“C”和“D”都为真,则原始结果将为真。 (2认同)