代码之家  ›  专栏  ›  技术社区  ›  GabrieleMartini Alberto Miola

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

  •  -1
  • GabrieleMartini Alberto Miola  · 技术社区  · 6 年前

    赋值中缺少等号(键入 = 而不是 == )在条件语句中进行不需要的赋值。 例如,考虑下面的场景(这个例子是用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 回复  |  直到 6 年前
        1
  •  1
  •   Govind Parmar vitaly.v.ch    6 年前

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

    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 变量。