C6237
警告 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");
}
}