【问题标题】:Why does Clang warn: `'&&' within '||'`?为什么 Clang 会在 '||' 内发出警告:`'&&'?
【发布时间】:2023-04-08 08:38:01
【问题描述】:

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

【问题讨论】:

  • 为了清晰添加代码怎么样?这里的括号可以帮助那些不记得&&|| 优先规则的人(这些规则并不经常出现)。
  • 我完全赞成添加代码以提高清晰度。然而,就我个人而言,我发现在这种情况下,不必要的括号的额外视觉噪音会降低清晰度。当我看到多余的括号时,我会立即扫描整行寻找它们的原因,当我没有找到时,我必须思考一会儿,如果我读错了,或者有问题的代码只是试图“帮助”我了解我已经知道的运算符优先级。这段代码绝对不适合没有经验的程序员,大多数阅读它的人都在我的水平,因此我认为会有同样的感觉。
  • @KingsIndian 编译器还警告if (x = 3),这是完全合法的。关键是,它被认为是人们经常出错的东西,所以编译器作者认为这是值得警告的。
  • 我也总是修复警告,并且发现人们提倡我添加不必要的代码来帮助那些未能学习诸如运算符优先级之类的重要内容的人是荒谬的。上帝保佑我曾经雇用过这么糟糕的程序员。
  • 为什么每个人都如此强烈地捍卫这个警告?如果每次你说“2 + 3 * 4”时编译器都会警告你,你会有什么感觉?这太荒谬了。假设程序员对他们正在使用的语言有基本的理解,并且不需要视觉混乱来理解优先级。另一方面,Xcode 似乎没有提供默认禁用此功能的选项...

标签: c clang


【解决方案1】:

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

【讨论】:

  • 对于那些想要抑制它的人,将:-Wno-logical-op-parentheses 附加到您的构建系统的 CFLAGS。
【解决方案2】:

我猜是因为它只是有点不清楚,除非读者非常擅长C's operator precedence rules

你的表情是这样的:

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

由于&&的优先级高于||,这意味着

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

我猜是你的意思,但是看的时候不是很清楚。

【讨论】:

  • 恕我直言,任何至少学习过基本逻辑的人都应该记住,在数学中,AND 的优先级高于 OR。我认为编译器在这里非常偏执。 (即,这绝对与if (a = 0) 不同。)
  • 完全同意——这是我见过的最无用的警告。为什么允许写 1+2*3 不建议改成 1+(2*3) ?
  • 可能是因为在现实世界中,大多数编码人员都非常确定 1+2*3 究竟做了什么,而他们中的大多数人不确定 a && b || c && d 究竟会做什么。
  • &&|| 没有重载时,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 是不正确的解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-08
  • 1970-01-01
  • 1970-01-01
  • 2013-09-18
  • 2014-09-25
  • 2011-06-25
相关资源
最近更新 更多