2010-05-05 3 views

ответ

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' как unsigned, но' 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

Даже если x и y являются int, вы всегда можете иметь следующие ...

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

... в теле ваш метод;)

Смежные вопросы