警告:建议括号周围的括号(*(arg_to ++)= *(arg_from ++));

时间:2018-01-19 04:47:58

标签: c++ pointers

我收到以下警告:

  

警告:建议用作真值的赋值括号[-Whatarentheses]

PolyUtil

它还需要我更多括号吗?

2 个答案:

答案 0 :(得分:1)

comment by @RaymondChen解释了警告信息。

我建议使用一些不那么神秘且有点冗长的代码。

while ( *arg_from != '\0' )
{
   *(arg_to++) = *(arg_from++);
}
*arg_to = '\0';

答案 1 :(得分:0)

编译器发出此类警告的历史原因是循环条件中的赋值

while (x = y)

通常是程序员实际打算进行比较的错字。

while (x == y)

然而,这实际上是一个有效的表达式,即使经常是一个错误,所以编译器(能够)被配置为警告它(例如指出使用=而不是== )。许多不同的C和C ++编译器(当配置为更高的警告级别时)已经在很长一段时间内对这种效果发出警告(我记得在90年代中期的C和C ++编译器中看到它,很可能它甚至在更老的编译器中)。

然而,程序员使用的一种hacky技术 - 当一个赋值是实际意图并且编译器警告它时 - 是将有问题的表达式包装在括号中并进行比较,例如

while ((x = y) != 0)

为了响应这些技术的使用,可以对编译器进行配置,以提供更多信息和信息。警告,例如建议在while (x = y)中添加括号以供程序员考虑。同样,编译器已经给出了一段时间的警告(我无法回想起,多少年前编译器开始这么做了。)

然而,真正的解决方案不是使用hacky解决方案,例如在这些表达式中添加括号和比较。更好的解决方案通常是使表达式尽可能简单 - 例如,避免在一个表达式中修改太多变量。

这样的表达式
while (*(arg_to++) = *(arg_from++));

或(更简约地说,删除不需要的括号)

while (*arg_to++ = *arg_from++);

具有多种效果 - *arg_to已修改,arg_toarg_from都会增加。为了避免在一个表达式中出现多重影响和副作用,可以做

while (*arg_from)    // equivalent to *arg_from != '\0'
{
     *arg_to = *arg_from;
     ++arg_to;
     ++arg_from;
}

其中每个表达式仅修改一个值。如果您愿意允许语句或表达式修改不超过两个值,则可以将其更改为

while (*arg_from)
{
     *arg_to++ = *arg_from++;
}

这两种形式都倾向于避免警告有关可疑任务或提示添加括号。

这些形式更具有主观性和可读性。 - 有些人会更喜欢一个,另一些则更喜欢。然而,一般来说,修改多个值的表达式(无论是在循环条件还是简单语句中)对于凡人来说更加神秘,因此更难以正确行事。同时更有可能触发编译器警告。

相关问题