赋值内部缺少等号(键入=
而不是==
)会在条件语句中造成不必要的赋值。
例如,请考虑以下情形(此示例在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)吗?
答案 0 :(得分:1)
问题是,在条件主体内为if
,while
或for
使用赋值是完全有效的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
变量时,此方法才起作用。