40

我的理解是括号没有区别,那么 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) {
                                 ~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
4

2 回答 2

29

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

于 2013-06-05T12:26:50.783 回答
26

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

你的表情是这样的:

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

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

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

我想这就是您的意思,但是阅读时并不是很清楚。

于 2013-06-05T12:28:51.957 回答