我收到以下警告:
警告:建议用作真值的赋值括号[-Whatarentheses]
PolyUtil
它还需要我更多括号吗?
答案 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_to
和arg_from
都会增加。为了避免在一个表达式中出现多重影响和副作用,可以做
while (*arg_from) // equivalent to *arg_from != '\0'
{
*arg_to = *arg_from;
++arg_to;
++arg_from;
}
其中每个表达式仅修改一个值。如果您愿意允许语句或表达式修改不超过两个值,则可以将其更改为
while (*arg_from)
{
*arg_to++ = *arg_from++;
}
这两种形式都倾向于避免警告有关可疑任务或提示添加括号。
这些形式更具有主观性和可读性。 - 有些人会更喜欢一个,另一些则更喜欢。然而,一般来说,修改多个值的表达式(无论是在循环条件还是简单语句中)对于凡人来说更加神秘,因此更难以正确行事。同时更有可能触发编译器警告。