Предупреждение C6236

('expression' || "ненулевая константа") всегда является ненулевой константой

Это предупреждение указывает на то, что ненулевое значение константы, отличное от одного, было обнаружено справа от логической операции OR, которая возникает в тестовом контексте. Логически это означает, что тест является избыточным и может быть безопасно удален. Кроме того, он предполагает, что программист может использовать другой оператор, например равенство (==), побитовую И () или побитовую XOR (&^) для проверки определенного значения или флага.

Замечания

Это предупреждение не создается для общей идиомы, если ненулевая константа равна 1, из-за его использования для выборочного включения путей кода во время компиляции. Однако предупреждение создается, если константа без нуля формируется выражением, которое оценивается как 1, например 1 + 0.

Имя анализа кода: LOGICALORNONZERO

Пример

В этом коде показано, как может отображаться предупреждение C6236. Так как INPUT_TYPE значение не равно 0, выражение n || INPUT_TYPE всегда не равно нулю, и else предложение никогда не выполняется. INPUT_TYPE Однако является константой со значением, отличном от одного, которое предполагает, что это означает как значение для сравнения:

#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 (&) для проверки того, INPUT_TYPE задан ли бит входного параметра n :

#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: &