2010-05-05 3 views
1

어떤 상황에서 다음 코드의 "거짓"부분이 실행됩니까?이 조건은 언제 False로 평가됩니까?

x = 20; 
y = -30; 
if (x > y) { 
    // True part 
} 
else { 
    // False part 
} 

NB : 언어는 C이고, 컴파일러는 gcc입니다 (다른 컴파일러도 같은 일을 할 수 있지만).

답변

6

y이 부호없는 정수 유형 인 경우 (음의 정수 값이 표현되는 방식으로 인해) 매우 큰 값으로 초기화되고 비교 표현식이 false으로 평가됩니다.

+2

그건 아니에요 "때문에 어떻게 부정적인 정수 값 표현되기 때문에 ", 이는 범위를 벗어나는 값을 부호없는 타입으로 변환하는 것이 언어에 의해 정의되는 방식 (표현과 독립적 임)이기 때문입니다. – caf

2
unsigned int x = 20; 
unsigned int y = -30; 

슬프게도, 내가 사용하고있는 컴파일러는 이것에 대한 컴파일 타임 경고를 제공하지 않습니다.

+2

@ a_m0d : 입증하십시오. –

+0

@Greg : 죄송합니다. (글쎄요.)'signed '와'unsigned' 사이에 혼란 스러워요. –

2

X와 Y가 부호없는 경우에만.

+0

사실, 그 중 하나만 서명 할 필요가 있습니다. 내가 본 경우에는'x'가 서명되지 않았지만' y '라고 표시되어 문제가 계속 발생했습니다. –

1

죄송합니다. 이것은 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; } 
+0

매우 창의적입니다 :-) –

2

에도 xy 경우 int, 당신은 항상 다음 가질 수 있습니다 ...

#define if(p) if(!(p)) 

... 귀하의 방법;)

관련 문제