如何防止条件语句中不必要的变量分配?

时间:2019-01-29 13:55:47

标签: debugging if-statement conditional assignment-operator

赋值内部缺少等号(键入=而不是==)会在条件语句中造成不必要的赋值。 例如,请考虑以下情形(此示例在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)吗?

1 个答案:

答案 0 :(得分:1)

问题是,在条件主体内为ifwhilefor使用赋值是完全有效的C,并且经常有意使用。例如,我经常在编写Win32 API GUI时使用以下框架代码创建窗口:

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变量时,此方法才起作用。