由於printf
功能而言,我理解從一些參考和實驗以下。錯誤格式說明
- 當我們試圖與用於浮法(或)格式說明雙和副打印的整數值反之亦然的行爲是不可預知的。
- 但是可以使用
%c
來打印整數值的等效字符。也可以使用%d
打印字符的ASCII值(整數表示)是可以接受的。
同樣,什麼是scanf
的行爲,如果有格式說明的不匹配,並通過了arguements到SCANF。標準是否定義了它?
由於printf
功能而言,我理解從一些參考和實驗以下。錯誤格式說明
%c
來打印整數值的等效字符。也可以使用%d
打印字符的ASCII值(整數表示)是可以接受的。同樣,什麼是scanf
的行爲,如果有格式說明的不匹配,並通過了arguements到SCANF。標準是否定義了它?
變量參數(匹配省略號的變量,...
)爲默認提升。這意味着所有較短的整數類型都被提升爲int
(或根據需要未經簽名)。 inte gers和字符(I believe)之間沒有區別。在printf
%d
和%c
之間的區別是價值僅僅是如何格式化。
scanf
是魚的不同水壺。你通過的所有參數是指針。指針之間沒有默認的專業版,並且傳遞與指針對象的類型匹配的確切格式說明符至關重要。
在這兩種情況下,如果你的格式說明不匹配提供的參數(如傳遞一個int *
到%p
在printf
),其結果是不確定的行爲,遠遠比做「不可預知」雪上加霜 - 這意味着你的計劃簡直是格格不入。
首先,由於促進,對應於轉換規格的類型可能不相同,被傳遞給函數的類型。例如,字符被提升爲整數,因此printf(「%c」)真的期望一個int,然後將其轉化爲一個無符號的字符。直接傳遞一個int與將該int傳遞給一個unsigned char相同,因此是安全的。
如果參數沒有預期的類型,例如,如果你傳遞一個浮動,而不是一個整數,那麼結果是不確定的。
它與scanf()的特別是災難性的,因爲自變量是指針。如果通過,當函數需要一個指向float的指針時,說一個指向char的指針,然後該函數將嘗試在一個1字節的位置寫入(比方說)4個字節,這很糟糕。你很可能會遇到段錯誤。
我不確定「不合格」是描述它的最好方法。如果行爲未定義,則您的程序基本上不正確,但實施並不需要警告您。 –
「在printf()中將'int *'傳遞給'%p'」可能不是最具說教性的例子,因爲許多C程序員認爲它是正確的。首先使用一個更明顯錯誤的例子可能會更好(例如'int *'到'%f'),然後可能包含將'int *'傳遞給'%p'的信息在技術上也是不正確的。 –
@PascalCuoq:嗯,我認爲這恰恰是教學法,因爲很多人錯誤地認爲這是正確的。 –