C6237

警告 C6237:(<零> && <表达式>)始终为零。<表达式> 从不会进行计算且可能有副作用

此警告意味着在测试上下文中出现的逻辑与运算的左侧检测到常数值 0。结果表达式的计算结果总是为 false。因此,不对逻辑与运算的右侧进行计算。这被称作为“短路计算”。

应当仔细检查表达式的右侧,确保为获得正确功能所需的任何副作用(如赋值、函数调用、递增和递减运算)都不受短路计算的影响。

表达式 (0 && n) 不产生副作用,通常用于有选择地选择代码路径。

示例

下面的代码演示生成此警告的各个代码示例:

#include <stdio.h>
#define INPUT_TYPE 0

int test();

// side effect: n not incremented
void f1( int n )
{
   if(INPUT_TYPE && n++) //warning: 6237
   {
      puts("code path disabled");
   }
   else
   {
      printf_s("%d - n was not incremented",n);
   }
}

// side effect: test() not called
void f2( )
{
   if(INPUT_TYPE && test()) //warning: 6237
   {
      puts("code path disabled");
   }
   else
   {
      puts("test() was not called");
   }
}

//side effect: assignment and function call did not occur
void f3( int n )
{
   if(INPUT_TYPE && ( n=test() )) //warning: 6237
   {
      puts("code path disabled");
   }
   else
   {
      printf_s("%d -- n unchanged. test() was not called", n);
   }
}

若要更正此警告,请使用下面的代码:

#include <stdio.h>
#define INPUT_TYPE 0
int test();

void f1( int n )
{
if(INPUT_TYPE)
{
  if(n++)
    {
      puts("code path disabled");
    }
}
else
  {
    puts("n was not incremented");
  }
}

void f2( )
{
   if(INPUT_TYPE)
   {
      if( test() )
      {
         puts("code path disabled");
      }
   }
   else
   {
      puts("test() was not called");
   }
}

void f3( int n )
{
   if(INPUT_TYPE)
   {
     n = test();
      if( n )
      {
         puts("code path disabled");
      }
   }
   else
   {
      puts("test() was not called");
   }
}

请参见

参考

C 逻辑运算符