我只是想知道,為什么當我試圖列印一個字符和一個整數值的加法時,我得到了一個0值。我的代碼如下:
int y。
y = 10;
char z;
z = '9'。
printf("%f", z y)。
uj5u.com熱心網友回復:
這個printf的呼叫
printf("%f"/span>, z y)。
引發了未定義的行為,因為你使用了不正確的轉換指定符%f和一個int型別的物件。
你需要對引數進行轉換,例如
printf( "%f", ( double )( z y ) 。)
或者
printf( "%f", ( float )( z y )。
盡管在最后一種情況下,由于默認的引數晉升,引數將被晉升為double型別。
uj5u.com熱心網友回復:
大多數情況下,當你呼叫一個函式時,如果你傳遞了錯誤的引數型別,C會自動為你轉換它。 例如,如果我寫
#include <math.h>
int i = sqrt(144)。
printf("%d
", i)。
這可以作業,并列印出12。 即使sqrt函式實際上想要一個double型別的引數 - 因為編譯器知道這一點,并且在將其傳遞給sqrt之前自動將我的int引數144轉換為double。 (在回傳的程序中也有一個轉換,因為sqrt回傳一個double,在分配給i之前,它必須被轉換回int。)
但是sqrt的引數144被轉換為double。
但是printf函式本身是這個規則的一個巨大的例外。 在你的代碼中,你有
printf("%f"/span>, z y)。
現在,你和我都知道%f想要一個double,但這并不是傳統意義上的C語言可以知道的事情。 就C語言而言,printf函式需要一個const char *型別的引數(即一個字串),然后可能需要一些其他的引數,這取決于運行時在格式字串中發現的特定的%序列。 因此,編譯器只做了一半的嘗試,將它們轉換為一些常見的型別,然后將它們傳遞給printf來完成剩下的作業。 在你的例子中,由于z是一個char和y是一個int,z y將是一個int,這就是被傳遞給printf。 當printf咀嚼著格式字串并找到格式指定符%f時,它沒有辦法知道實際傳遞的是什么型別的引數,所以它甚至不能嘗試做任何自己的轉換。 它所能做的就是假設你實際上傳遞了一個 double - 而且,由于你沒有,你得到了一個毫無意義的列印值。
現在,盡管正如我剛剛解釋的那樣,編譯器在傳統上沒有任何許可來嘗試將printf引數轉換為正確的型別,但現代編譯器通常會偷看一下格式字串,如果他們可以的話,并檢查事情在運行時是否會正常作業。 例如,當我通過我的一個編譯器運行你的代碼時,我得到warning: format指定了'double'型別,但是引數的型別是'int'。 如果你的編譯器沒有給你這樣的警告,你可能想知道是否有辦法啟用它們,因為它們顯然是超級方便的。
uj5u.com熱心網友回復:
正如在評論部分已經指出的,你有責任確保格式字串和函式引數的匹配。在你的例子中,它們并不匹配。運算式z y的結果是int型別,但是你在格式字串中使用了%f轉換指定符,這只對資料型別float和double有效(float get promoted to double)。
正如評論部分所指出的,你有兩個選擇來解決這個問題:
int型別的引數,或者double或float使用選項1的解決方案看起來是這樣的:
改變這一行printf("%f"/span>, z y)。
to
printf("%d"/span>, z y)。
使用選項2的解決方案看起來是這樣的:
改變這一行printf("%f"/span>, z y)。
to
printf("%f", (double) (z y) ) 。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/306946.html
標籤:
