Share via


C6291

경고 C6291: 논리적 결과에 대해 비트 연산을 수행했습니다. !는 |보다 우선 순위가 높습니다. 대신 || 또는 (!(x | y))를 사용하십시오.

! 연산자의 결과는 부울이며 |(비트 OR) 연산자는 두 개의 산술 인수를 사용합니다. 또한 ! 연산자는 보다 우선 순위가 높습니다 |.

따라서 다음 오류 중 하나가 발견되었습니다.

  • 식에 괄호가 누락되었습니다.

    !의 결과는 부울(0 또는 1)이기 때문에 두 변수에 비트 집합이 있는지 테스트하려고 하면 오른쪽에 최하위 비트가 있는지 여부만 테스트됩니다. 이 경우 x == 0이고 y == 1이면 ((!x) | y) != (!(x | y))입니다.

  • ! 연산자가 잘못되었으며 대신 ~여야 합니다.

    ! 연산자의 결과는 부울이지만 ~ 연산자의 결과는 산술입니다. 부울 값(0 또는 1)에 대해 연산하는 경우에도 이들 연산자는 혼용해서 사용할 수 없습니다. 즉, x == 1이고 y == 0이면 ((!x) | y) != ((~x) | y)입니다.

  • 이항 연산자인 | 연산자가 올바르지 않으며 ||를 대신 사용해야 합니다.

    일부 경우에는 | 연산자를 || 연산자와 혼용하여 사용할 수 있지만 전자의 경우는 식의 오른쪽을 강제로 평가하기 때문에 이 둘은 동일하지 않습니다. 이러한 식은 경우에 따라 예상치 못한 결과가 발생할 수도 있습니다. (!p | (*p == '\0'))의 경우 p == NULL이면 이를 역참조하여 식의 나머지 반을 평가해야 합니다.

! 연산자가 | 연산자의 오른쪽에 있는 경우에는 연산자가 잘못 사용되었지만 특별한 문제가 없으므로 경고가 보고되지 않습니다.

코드를 검사하지 않고는 이 문제의 심각도를 판단하기 어렵습니다. 코드를 검사하여 의도한 테스트가 수행되는지 확인해야 합니다.

이 경고는 항상 연산자 사용 또는 연산자 우선 순위에 혼동이 있을 수 있음을 나타냅니다.

예제

다음 코드에서는 이 경고를 발생시킵니다.

void f(int x, int y )
{
  if (!x | y)
  {
    //code 
  }
}

이 경고를 해결하려면 다음 코드에 있는 메서드 중 하나를 사용합니다.

void fC(int x, int y )
{
  /* When checking whether any bits are set in either x or y. */
  if (!(x | y))
  {
    // code
  }
  /* When checking whether bits are set in either */
  /* the complement of x or in y. */
  if ((~x) | y)
  {
    // code
  }
}

#include <windows.h>
void f(int x, BOOL y )
{
  /* When y is a Boolean or Boolean result. */
  if ((!x) || y)
  {
    // code
  }
}