2013-12-19 188 views
1

我在書中遇到了一個問題,它要求我編寫以下程序的輸出。這個程序的邏輯是什麼?

#include<stdio.h> 

int main() 
{ 
    int j=4; 
    (!j != 1 ? printf("\nWelcome") : printf("GooD Bye")); 
    return 0; 
} 

我基本上無法理解如何在運行該程序時打印歡迎詞。任何人都可以在操作符的層次結構的幫助下解釋,以及編譯器根據表達式計算什麼值?

+0

首先看與j !!!。 !!反轉TRUE/FALSE值。在這種情況下,TRUE是任何非零(4是),並且FALSE是0.因此,!j與!4相同,其值爲FALSE(或0)。 0!= 1的計算結果爲TRUE,所以執行速記的第一部分if/else,即「歡迎」部分。 –

+0

邏輯NOT運算符!將把非零整數轉換爲零,並將零轉換爲某個非零(通常爲1),但如果彈出-1,則不會感到驚訝。這是Forth在標準化過程中面臨的一個窘境。是所有零位,全部一位還是單一位的邏輯非?我不認爲ANS Forth委員會能夠解決這個問題,而且在規範中沒有被定義(悲傷)。 –

+0

@BrianTiffin - 所以我可能有時遇到一個情況,以及邏輯非運算符可能返回(-1)?看起來我不得不爲此添加一個案例,以及在使用邏輯NOT的一些程序中。 –

回答

7

(!j != 1 ? printf("\nWelcome") : printf("GooD Bye")); 

相當於

if(!j != 1) 
    printf("\nWelcome); 
else 
    printf("Good Bye"); 

這裏!j評估爲0因此條件!j != 1將永遠是真實的,它會打印Welcome

+1

感謝您以這種方式解釋它,我在比較部分中感到困惑:ko: –

+0

我討厭成爲[REP CAPPED!](http:/ /meta.stackexchange.com/q/63327)Grrrrr .... – haccks

+0

大聲笑,這不是問題,但是肯定我需要得到50個代表才能給其他人的問題添加評論-_- –

1

是啊混亂的C!

在c!j中計算結果爲0,因爲它是一個非0的數字,所以0!= 1是真的,在那裏執行三元操作的真實部分並打印「welcome」。

所以重新評估:

4 = 0 //或任何數量的

0 = 1

+0

你的回答讚賞隊友:) –

+0

我把(!j!= 1)視爲兩個不同的實體,而不是一個造成混淆的實體: –

+0

是的,比較可以真正混淆。 – dbarnes