共用方式為


C6237

更新:2007 年 11 月

警告 C6237: (<零> && <運算式>) 永遠為零。<運算式> 不會加以評估且可能有副作用

這項警告表示在發生於測試內容中的邏輯 AND 運算左側,偵測到值為零的常數。結果運算式永遠會評估為 false。因此,不會評估邏輯 AND 運算的右側。這就是所謂的「最少運算評估」。

您應該仔細檢查運算式的右側,確定任何副作用 (例如適當功能所需的指派、函式呼叫 (Function Call)、遞增和遞減運算) 都不會受到最少運算評估所影響。

運算式 (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 Logical Operators

編譯器警告 (層級 4) C4127