C中的變量長度參數列表函數如printf() , scanf(), etc
如何與C++中的函數重載不同?在C中重載還是不重載?
以及如何調用
printf("Didnt Work %s",s);
從
printf(s,"Didnt Work %s");
不同,其中S定義爲:
const char *s="string";
請解釋。
C中的變量長度參數列表函數如printf() , scanf(), etc
如何與C++中的函數重載不同?在C中重載還是不重載?
以及如何調用
printf("Didnt Work %s",s);
從
printf(s,"Didnt Work %s");
不同,其中S定義爲:
const char *s="string";
請解釋。
在
const char *s="string";
printf(s,"Didnt Work %s");
的第一個參數 「串」 被解釋爲格式字符串。它沒有插入代碼,所以第二個參數不會被使用。結果將是「字符串」。
OTOH
printf("Didnt Work %s",s);
有插入的代碼,所以第二個參數被插入一個字符串,其結果是「沒有工作字符串」。
這不是重載,因爲雖然不同的參數類型是可能的,就像在重載中一樣,但在變量參數中總是調用相同的函數。隨着重載,根據參數類型調用不同的函數。
重載允許編譯器檢查參數的特定順序。在C++中,如果至少有一個函數定義的類型不匹配,編譯器會發出抱怨。另一方面,具有可變長度參數的C,在編譯時沒有這種類型檢查。編譯器不檢查任何參數以確保它們排隊。如果不是全部編譯器,則可以編譯printf("1",3);
。 Printf將嘗試將第一個參數作爲字符串讀取,並將繼續讀取,直到它到達表示字符串結尾的空字節。這就是爲什麼不鼓勵變長參數列表的原因。
要回答你的第二個問題,其他人已經第一個問題了。
C中的變量參數列表與C++中的重載非常不同。在C語言中,你有一個函數printf
,它可能對不同類型的參數做不同的事情。在C++中,通過重載,您可以根據參數的類型在不同的函數中進行選擇。
'printf(1,3);'不會在任何編譯器上編譯。 「printf」的第一個參數是鍵入的,也就是說,它需要一個「const char *」。但是你的論點在變長參數不安全的原則上是正確的。 – 2011-03-17 06:09:29
你是完全正確的。我應該解決這個問題... – datdo 2011-03-17 15:08:46