2011-04-08 93 views
3

我對此的理解如下。在C,如果它被賦予一個非零值,如果它被賦予返回一個非零值0關於C的問題!運營商

說當你有C代碼這個小片段的!操作返回0:

int y = 0; 
int z = !y; 

什麼樣的價值會進入z?它只需要!0爲1?它依賴於系統嗎? C標準是否規定了應該發生的事情?在今天早些時候做一些家庭作業時,我遇到了這些問題,處理按位2的補碼整數操作。我遇到了一些問題需要解決,但我有點摸不着頭腦,因爲爲什麼有效。非常感謝任何信息! C「所產生的」

+0

函數返回一個值。表達式被評估。一個表達式!是應用的最後一個運算符將評估爲1或0. – 2011-04-08 11:59:10

+0

誰告訴你它返回「非零值,如果它給出0」?在這種情況下返回1。這是由語言明確定義的。 – 2011-04-08 13:28:26

+0

我可能混淆了自己,錯誤地認爲,因爲!對於任何非零值作爲其操作數,它的計算結果爲0,它也以某種方式反向應用。 – 2011-04-08 18:33:45

回答

8

真理值始終爲0或1。

這是事實(HEH)在if非零表達通常被認爲是「真」等,但是,當語言本身需要生成一個真值,它使用0代表假,1代表真。

由於!運營商是一個邏輯運算符,它總是會產生0或1

所以你的情況,z將被設置爲1。

更新:更多見this FAQ entry討論,這就是我對「由......產生」措辭的想法。令人驚訝的是,它甚至有相同的雙關語(在寫我的答案之前我沒有看這個條目)。不知道這是否表明我有幽默感,或者沒有。

+0

由C生成的「真值」始終爲0或1.錯誤! 「if(1234)'也是如此。真是任何非零值。 – Sadique 2011-04-08 11:49:36

+0

我認爲'1234'在你的例子中並不是「由C生成」,意思就是放鬆*。 – 2011-04-08 11:51:04

+1

@Acme:重新閱讀關於*「由...生成」的部分C * – 2011-04-08 11:51:33

4

運算符!的一元表達式的結果爲int,其值爲01

3

運算符邏輯否定 的結果!如果其操作數 的值不等於0,則爲0,如果爲 ,則其操作數的值將比較 等於0.結果的類型爲int。表達式E相當於 (0 == E)。

來自C標準(n1124)第6.5.3.3節。

+0

感謝您的參考! – 2011-04-08 18:32:19