【发布时间】:2019-06-22 16:14:21
【问题描述】:
赋值中缺少等号(键入 = 而不是 ==)会在条件语句中产生不需要的赋值。
例如,考虑下面的场景(这个例子是用 C 语言编写的,但问题也适用于解释代码)。
案例一:
int g=1;
if ( g == 3 )
{
printf("g is 3");
}
else
{
printf("g is not 3");
}
//this return: "g is not 3"
案例 B: (错字:缺少= 内部条件)
int g=1;
if ( g = 3 )
{
printf("g is 3");
}
else
{
printf("g is not 3");
}
//this return: "g is 3" because of the assignment
这两种情况在形式上都是正确的,所以代码可以工作,但不是我们想要的;并且可能很难调试。
如何预防这种情况?除了静态分析器之外,还有一个解决方案可以涵盖解释代码(例如 javascript)吗?
【问题讨论】:
-
大多数编译器都可以配置为在您执行此操作时发出警告。
-
case B 会将 3 分配给 g,然后将 g 测试为布尔值,因为 g 不是 false,所以 g 始终为 3,但这不是预期的,也不是预期的分配。您可以只使用宏来执行测试,将 g 传递给宏并在条件中使用宏。
-
最简单的解决方案:配置您的编译器以警告任何条件子句中的任何赋值,将它们视为错误,并且从不首先将赋值填充到条件子句中。在编写代码时,您不应该将“代码简洁”作为目标——可读、可理解和可维护代码才是目标。这意味着不要使用容易出错的结构,即使它们是“合法代码”。
标签: debugging if-statement conditional assignment-operator