어떤 상황에서 다음 코드의 "거짓"부분이 실행됩니까?이 조건은 언제 False로 평가됩니까?
x = 20;
y = -30;
if (x > y) {
// True part
}
else {
// False part
}
NB : 언어는 C이고, 컴파일러는 gcc입니다 (다른 컴파일러도 같은 일을 할 수 있지만).
어떤 상황에서 다음 코드의 "거짓"부분이 실행됩니까?이 조건은 언제 False로 평가됩니까?
x = 20;
y = -30;
if (x > y) {
// True part
}
else {
// False part
}
NB : 언어는 C이고, 컴파일러는 gcc입니다 (다른 컴파일러도 같은 일을 할 수 있지만).
y
이 부호없는 정수 유형 인 경우 (음의 정수 값이 표현되는 방식으로 인해) 매우 큰 값으로 초기화되고 비교 표현식이 false
으로 평가됩니다.
unsigned int x = 20;
unsigned int y = -30;
슬프게도, 내가 사용하고있는 컴파일러는 이것에 대한 컴파일 타임 경고를 제공하지 않습니다.
@ a_m0d : 입증하십시오. –
@Greg : 죄송합니다. (글쎄요.)'signed '와'unsigned' 사이에 혼란 스러워요. –
X와 Y가 부호없는 경우에만.
사실, 그 중 하나만 서명 할 필요가 있습니다. 내가 본 경우에는'x'가 서명되지 않았지만' y '라고 표시되어 문제가 계속 발생했습니다. –
죄송합니다. 이것은 C++입니다. 어쨌든 재미 있습니다. 누군가 불평하지 않으면 삭제하지 않겠습니다.
static_cast
에서 약간의 도움이 필요하지만 static_cast
은 안전합니까? 본문에
enum E { ea = 20, eb = -30 } x;
enum F { fa = 20, fb = -30 } y;
bool operator>(E const &l, F const &r)
{ return static_cast<int>(l) < static_cast<int>(r); }
x = static_cast<E>(20);
y = static_cast<F>(-30);
또는 약간 느슨한
,enum E { x = 20 };
enum F { y = -30 };
bool operator>(E, F)
{ return false; }
매우 창의적입니다 :-) –
에도 x
및 y
경우 int
, 당신은 항상 다음 가질 수 있습니다 ...
#define if(p) if(!(p))
... 귀하의 방법;)
그건 아니에요 "때문에 어떻게 부정적인 정수 값 표현되기 때문에 ", 이는 범위를 벗어나는 값을 부호없는 타입으로 변환하는 것이 언어에 의해 정의되는 방식 (표현과 독립적 임)이기 때문입니다. – caf