警告 C6237

('zero' && 'expression') 始终为零。 'expression' 从不会进行计算且可能有副作用

备注

此警告指示在测试上下文中发生的逻辑 and 运算的左侧检测到零常量。 结果表达式的计算结果始终为 false。 因此,不会计算逻辑 AND 运算的右侧。 此语言功能称为“短路评估”。

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

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

代码分析名称:ZEROLOGICALANDLOSINGSIDEEFFECTS

示例

以下代码显示了生成此警告的各种代码示例:

#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 逻辑运算符