如果在 if 语句中用作真值的赋值周围缺少不必要的括号,为什么 -Wparentheses 会发出警告?

问题描述 投票:0回答:1

-Wparentheses
在以下代码片段中向我发出警告:

long n = -1;
bool asking = true;
do
{
  ask_into("Enter the order of this Bezier curve (# of points):", n);
  if (asking = n <= 0) // <-- WARNING: "suggest parentheses around assignment used as truth value"
  {
    std::cout << "Please enter a number > 0.\n";
  }
}
while (asking);

如果我将有问题的行更改为以下内容,警告就会消失:

if ((asking = n <=0)) // warning gone, but why the double parentheses?

赋值语句周围看似不必要的括号是否有任何理由,或者这只是确保我不打算使用

==
来代替?是否有更明确的首选语法需要括号来满足此警告而不将赋值语句与条件分开?

如果有任何帮助,我使用的编译器是 MSYS2 mingw-w64 g++ 12.2.0

c++ c++17 compiler-warnings
1个回答
0
投票

这是预期的行为。

-Wparentheses
警告会在赋值表达式用作条件时发出警告,但前提是直接使用赋值表达式。赋值周围的额外括号将使警告忽略该条件。

重点是确保您没有意外地写下

=
而不是
==
。因为您通常不会在表达式周围添加不必要的括号,如果您did添加了它们,那么它被认为是一个暗示,表明您真的考虑过它并且打算这样写,因此会出现警告不应该被生产。

有和没有额外的括号在功能上没有区别。

© www.soinside.com 2019 - 2024. All rights reserved.