[英]Why are variables of type size_t casted to (unsigned) in a printf call?
我正在編寫一個程序並在這個網站http://www.cplusplus.com/reference/cstring/strlen/ 上查找 strlen() function 。 我看到在使用 function 的示例中,代碼的作者 put (unsigned) 將 function 的結果轉換為 unsigned。 我知道這樣做是因為 function 返回 size_t 類型,它是無符號的,但這真的有必要嗎?
/* strlen example */
#include <stdio.h>
#include <string.h>
int main ()
{
char szInput[256];
printf ("Enter a sentence: ");
gets (szInput);
printf ("The sentence entered is %u characters long.\n",(unsigned)strlen(szInput));
return 0;
}
在代碼示例中,這是因為它是與printf
中的%u
格式說明符對應的參數。
printf 的可變參數printf
必須具有完全正確的說明符類型,否則行為是 undefined 。 %u
的參數類型是unsigned
的。
size_t
是一個 typedef,它可能會或可能不會解析為unsigned
,因此強制轉換對於在所有平台上定義良好的調用是必要的。
另一種方法是使用專為size_t
設計的%zu
格式說明符,盡管這有一個實際問題,即如果庫不符合 C99,它將失敗。
這樣做是為了便攜性。 size_t
格式描述符有一個修飾符,使用字母z
,如%zu
(表示size_t
操作數的無符號格式),它將接受size_t
參數,與您使用的體系結構無關。
根據您使用的 unix 的風格,您遵循的標准,您將遇到接受或不接受z
的系統,其中size_t
存在或不存在(非常舊的系統沒有size_t
類型)因此,作為strlen()
的結果strlen()
可能被代碼的作者知道很短,那么最可移植的解決方案是將數據轉換為printf()
允許的類型,然后使用已知的格式說明符。 在你的情況下,作者決定使用(unsigned)
因為程序可能已經從 32 位架構(有或沒有z
修飾符)更改為 64 位架構,不知道它是否需要unsigned int
或unsigned long
來指定結果. 由於字符串足夠短以適合unsigned
,因此無需使用z
修飾符,用戶可能不知道該修飾符,或者她/他使用的編譯器實現中不存在該修飾符。
這很常見,因為在系統中應為off_t
、 dev_t
、 ino_t
等保留一個字母。其中許多依賴於操作系統,並且不包含在用戶通常編程的標准中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.