2010-05-05 45 views
1

在什麼情況下會執行以下代碼的「False」部分?什麼時候該條件評估爲False?

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

注意:語言是C,編譯器是gcc(儘管一些其他編譯器也可能做同樣的事情)。

回答

6

如果y是無符號整數類型,它將被初始化爲一個非常大的值(因爲表示負整數值的方式)並且比較表達式將計算爲false

+2

這不是真的「因爲如何負整數值表示「,這是因爲這就是語言定義的超範圍值到無符號類型的轉換是如何定義的(它與表示無關)。 – caf 2010-05-05 12:25:23

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

不幸的是,我使用的編譯器甚至沒有提供關於此的編譯時警告。

+2

@ a_m0d:證明它。 – 2010-05-05 06:17:36

+0

@Greg:哎呀,我的壞:(我一直在'signed'和'unsigned'之間混淆 – 2010-05-05 06:29:12

2

只有當X和Y是無符號的。

+0

實際上,其中只有一個需要unsigned - 我看到它的情況有'x'作爲unsigned,但' y'作爲簽名,問題依然存在。 – 2010-05-07 01:48:56

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

非常有創意!:-) – 2010-05-05 07:35:08

2

即使xyint,你總是可以有以下...

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

...在體內你的方法;)

相關問題