工作,我有以下代碼:這是爲什麼不printf()函數在C
int i=1;
printf((i==1)?" ":" " "hello");
printf(" " "hello");
而且我驚訝地看到,第一printf
只給出了一個空間,輸出和第二printf
輸出空間後面跟着字符串hello。我希望第一次輸出像第二次輸出。但是有什麼我在這裏失蹤。請幫我這個...
工作,我有以下代碼:這是爲什麼不printf()函數在C
int i=1;
printf((i==1)?" ":" " "hello");
printf(" " "hello");
而且我驚訝地看到,第一printf
只給出了一個空間,輸出和第二printf
輸出空間後面跟着字符串hello。我希望第一次輸出像第二次輸出。但是有什麼我在這裏失蹤。請幫我這個...
字符串文字加盟是一個詞彙特徵,這意味着這樣的:
(i==1) ? " " : " " "hello"
是一樣的:
(i==1) ? " " : " hello"
現在應該是很明顯的,爲什麼你得到你所得到的結果。
哦上帝..爲什麼不是我在想......非常感謝 –
i == 1
是真實的,所以三元運算符評估爲兩個選項中的第一個," "
。一點也不令人意外。
是的,我想奇怪的就像留下了字符串你好嗎?:operator..thank你 –
由於在三元運算符(i==1
)中測試的條件評估爲true,因此它會在?
之後立即返回表達式。
的ternary operator的語義是這樣的:
test_something?if_true:not_true
你printf
語句的工作,因爲它應該。
C自動將兩個相鄰的字符串文字組合在一起。
因此,你的參數到第二個printf:" " "hello"
被連接在一起成爲" hello"
,然後正常打印出來。
其他答案已經解釋了爲什麼你的第一個printf工作的方式,它應該是非常明顯的。
您的困惑的根源是對何時進行拼接的誤解。連接兩個連續的字符串文字由編譯器在編譯時完成,而不是在運行時由程序完成。因此,解析第一個printf只有一種方法:兩個字符串文字都屬於表達式的「else」分支。您可以通過將i設置爲零並觀察輸出來進行測試。
yes..in第一次printf在真實條件下有單個空間並且在假狀態下它具有打印雙空間,接着是打印字符串hello ....並且在第二個printf中單個空間後跟字符串hello .. –
這裏真正的混亂可能是操作/操作符優先級問題的順序。基於海報的問題,我假設在printf的第一次調用中有一組缺失的圓括號。 – reuben
括號,你假設哪部分? –