MSVC의 부호 있는 값과 부호 없는 값의 비교: 경고 부재 이해
이 코드 조각에서는 다음에 대한 경고가 없음을 알 수 있습니다. 구체적인 비교:
int a = INT_MAX; unsigned int b = UINT_MAX; bool c = false; ... if (a == b) // no warning
이것은 왜 부호 있는 값과 부호 없는 값 간의 비교는 ==를 사용하여 비교할 때 경고를 트리거하지 않는 반면, 다른 비교(<, >, <=, >=)에서는 경고가 발생합니다.
백그라운드 승격 및 C4018
이 비교가 배경 승격으로 인해 경고를 생성할 것으로 예상했습니다. 그러나 마지막 두 예는 이 논리를 반박합니다.
if (((unsigned int)a) == b) // no warning if (a == ((int)b)) // no warning
변환 규칙
부호 있는 값과 부호 없는 값을 비교할 때 컴파일러는 C 언어에 설명된 특정 변환 규칙을 따릅니다. 기준. 같음 비교(==)의 경우 결과가 항상 부울(true 또는 false)이므로 피연산자가 부호가 있든 없든 상관없습니다.
그러나 다른 비교의 경우 부호 있는 값이 변환됩니다. 서명되지 않은 상태로. 이 변환은 비교 결과에 영향을 미치기 때문에 중요합니다. 예를 들어 다음 명령문에서는
-1 > 2U
-1이 부호 없는 큰 양의 정수로 변환되어 올바른 비교가 이루어지기 때문에 결과는 true입니다.
MSVC 경고 수준
부호/비부호 동등 비교에 대한 경고를 표시하지 않는 MSVC의 선택은 의도적인 것입니다. 개발자에 따르면 ==를 사용하여 부호 있는 값과 부호 없는 값을 비교하면 직관적인 결과가 나오는 경우가 많습니다. 예를 들어, -1 == -1은 부호가 있든 없든 상관없이 참입니다.
반면에 부호가 있는/부호가 없는 경우보다 큼(>) 또는 보다 작음(<)을 포함하는 비교는 조합을 사용하면 예상치 못한 결과가 발생할 가능성이 더 높습니다. 따라서 MSVC는 개발자가 잠재적인 문제를 파악하는 데 도움이 되도록 최적화 초기 단계에서 이러한 비교에 대한 경고를 발행합니다.
위 내용은 MSVC가 부호 있는/부호 없는 동등 비교(==)에 대해서는 경고하지 않지만 다른 비교에 대해서는 경고하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!