提问人:GabrieleMartini 提问时间:1/29/2019 最后编辑:GabrieleMartini 更新时间:1/30/2019 访问量:180
如何防止条件语句中不需要的变量赋值?
How to prevent unwanted variable assignment inside condition statement?
问:
赋值中缺少等号(键入而不是键入)会在条件语句中进行不需要的赋值。
例如,考虑下面的场景(此示例是用 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赞
Govind Parmar
1/30/2019
#1
问题是,在条件体中使用 , 或 的赋值是完全有效的 C,并且经常被故意使用。例如,在编写 Win32 API GUI 时,我经常发现自己使用以下框架代码来创建窗口:if
while
for
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()
评论