如何防止条件语句中不需要的变量赋值?

How to prevent unwanted variable assignment inside condition statement?

提问人:GabrieleMartini 提问时间:1/29/2019 最后编辑:GabrieleMartini 更新时间:1/30/2019 访问量:180

问:

赋值中缺少等号(键入而不是键入)会在条件语句中进行不需要的赋值。 例如,考虑下面的场景(此示例是用 C 语言编写的,但该问题也适用于解释型代码)。===

案例 A:

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)的解决方案吗?

调试 if-statement 条件语句 赋值运算符

评论

0赞 Raymond Chen 1/29/2019
大多数编译器都可以配置为在执行此操作时发出警告。
1赞 SPlatten 1/30/2019
案例 B 将 3 分配给 g,然后将 g 测试为布尔值,因为 g 不是假的,它总是 g 是 3,但这不是预期的,也不是预期的。您可以只使用宏来执行测试,将 g 传递给 marco 并在条件中使用宏。
0赞 Andrew Henle 1/30/2019
最简单的解决方案:将编译器配置为警告任何条件子句中的任何赋值,将它们视为错误,并且从一开始就不要将赋值塞入条件子句中。在编写代码时,“代码的简洁性”不是你应该作为目标的东西——可读、可理解和可维护的代码才是目标。这意味着不要使用容易出错的结构,即使它们是“法律代码”。

答:

1赞 Govind Parmar 1/30/2019 #1

问题是,在条件体中使用 , 或 的赋值是完全有效的 C,并且经常被故意使用。例如,在编写 Win32 API GUI 时,我经常发现自己使用以下框架代码来创建窗口:ifwhilefor

if((hWnd = CreateWindowExW(...)) == NULL)
{
    MessageBoxW(NULL, L"Window creation failed", L"Error", MB_OK | MB_ICONSTOP);
    return GetLastError();
}

如果测试只是为了相等,并且你想避免意外使用运算符,你可以做的一件事就是养成将 r 值放在运算符左侧的习惯,这样如果你不小心使用了 ,就会产生编译错误:==

char *p = malloc(100000);
if(NULL == p)
{
    // handle null pointer
}

显然,这仅在比较的至少一侧是 r 值或变量时才有效。const

评论

0赞 Andrew Henle 1/30/2019
问题是,在条件体中使用 if、while 或 for 的赋值是完全有效的 C,并且经常被故意使用。将赋值塞入 if 条件绝对不会给你带来任何好处,而且如果你错过了一组括号,代价是可能不可能找到错误。您如何处理诸如调用后具有三个分支的函数?fork()