【问题标题】:How to prevent unwanted variable assignment inside condition statement?如何防止条件语句中不需要的变量赋值?
【发布时间】: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


【解决方案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 变量时才有效。

【讨论】:

  • 问题是,在 if、while 或 for 条件体中使用赋值是完全有效的 C 语言,并且经常被有意使用。 并将赋值填充到如果条件绝对没有给您带来任何好处,并且如果您错过一组括号,则可能会以不可能找到的错误为代价。以及如何处理诸如 fork() 这样在调用后具有三个分支的函数?
猜你喜欢
  • 1970-01-01
  • 2013-01-14
  • 2016-09-07
  • 2021-08-13
  • 1970-01-01
  • 2020-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多