次の方法で共有


警告 C6236

('expression' ||'non-zero constant') は常に 0 以外の定数です

この警告は、テスト コンテキストで発生する論理 OR 演算の右辺で、1 以外の 0 でない定数値が検出されたことを示します。 論理的には、テストは冗長であり、安全に削除できることを意味します。 また、プログラマが特定の値またはフラグをテストするために、異なる演算子 (等価比較 (==)、ビットごとの AND (&)、ビットごとの XOR (^) 演算子など) を想定した可能性があることも示しています。

解説

この警告は、コンパイル時にコード パスを選択的に有効にするために使用されるため、0 以外の定数が 1 の場合、共通のイディオムに対しては生成されません。 ただし、0 以外の定数が 1 に評価される式 (たとえば、1 + 0) によって形成されている場合、警告が生成されます。

コード分析名: LOGICALORNONZERO

このコードは、警告 C6236 を表示させる方法を示しています。 INPUT_TYPE 0 ではないので、式n || INPUT_TYPEは常に 0 以外でありelse、句は実行されません。 ただし、 INPUT_TYPE 1 以外の値を持つ定数は、比較の値として意味されることを示唆します。

#define INPUT_TYPE 2
#include <stdio.h>

void f( int n )
{
   if ( n || INPUT_TYPE ) // analysis warning C6236
   {
      puts( "Always gets here" );
   }
   else
   {
      puts( "Never enters here" );
   }
}

次のコードでは、代わりにビットごとの AND (&) 演算子を使用して、入力パラメーター nINPUT_TYPE ビットが設定されているかどうかをテストします。

#define INPUT_TYPE 2
#include <stdio.h>

void f( int n )
{
   if ( n & INPUT_TYPE ) // no warning
   {
      puts( "Bitwise-AND comparison is true" );
   }
   else
   {
      puts( "Bitwise-AND comparison is false" );
   }
}

関連項目

ビットごとの AND 演算子: &