2012-06-30 64 views
3

工作,我有以下代碼:這是爲什麼不printf()函數在C

int i=1; 
    printf((i==1)?" ":" " "hello"); 
    printf(" " "hello"); 

而且我驚訝地看到,第一printf只給出了一個空間,輸出和第二printf輸出空間後面跟着字符串hello。我希望第一次輸出像第二次輸出。但是有什麼我在這裏失蹤。請幫我這個...

+0

yes..in第一次printf在真實條件下有單個空間並且在假狀態下它具有打印雙空間,接着是打印字符串hello ....並且在第二個printf中單個空間後跟字符串hello .. –

+0

這裏真正的混亂可能是操作/操作符優先級問題的順序。基於海報的問題,我假設在printf的第一次調用中有一組缺失的圓括號。 – reuben

+0

括號,你假設哪部分? –

回答

8

字符串文字加盟是一個詞彙特徵,這意味着這樣的:

(i==1) ? " " : " " "hello" 

是一樣的:

(i==1) ? " " : " hello" 

現在應該是很明顯的,爲什麼你得到你所得到的結果。

+0

哦上帝..爲什麼不是我在想......非常感謝 –

2

i == 1是真實的,所以三元運算符評估爲兩個選項中的第一個," "。一點也不令人意外。

+0

是的,我想奇怪的就像留下了字符串你好嗎?:operator..thank你 –

1

由於在三元運算符(i==1)中測試的條件評估爲true,因此它會在?之後立即返回表達式。

ternary operator的語義是這樣的:

test_something?if_true:not_true 

printf語句的工作,因爲它應該。

2

C自動將兩個相鄰的字符串文字組合在一起。

因此,你的參數到第二個printf:" " "hello"被連接在一起成爲" hello",然後正常打印出來。

其他答案已經解釋了爲什麼你的第一個printf工作的方式,它應該是非常明顯的。

1

您的困惑的根源是對何時進行拼接的誤解。連接兩個連續的字符串文字由編譯器在編譯時完成,而不是在運行時由程序完成。因此,解析第一個printf只有一種方法:兩個字符串文字都屬於表達式的「else」分支。您可以通過將i設置爲零並觀察輸出來進行測試。

相關問題