有誰知道爲什麼的putchar()
,fputc()
和putc()
參數類型不是char
,但putwchar()
,fputwc()
和putwc()
參數類型是wchar_t
?另見this和this。爲什麼參數類型的`putchar()`,`fputc()`和`putc()`不是`char`?
回答
答案是'傳統'(或'歷史')。在C90標準之前,沒有函數原型和所有參數的所有功能都受到違約促銷規則,所以char
被作爲int
(short
自動傳遞晉升爲int
過了,float
到double
,同樣地,對於無符號類型)。該標準不能破壞現有的代碼,因此它保留了這些函數的類型。它在實踐中幾乎沒有什麼區別。即使您傳遞的值超出範圍,您傳遞的值也會被視爲字符類型。的fputc(int c, FILE *stream)
說明書說:
的
fputc
功能由c
(轉換爲unsigned char
)指定的字符寫入到輸出流指向由stream
...
默認促銷規則
§6.5.2.2函數調用
¶6如果ex表示被調用函數的壓縮類型不包含原型,整數提升在每個參數上執行,參數 的類型爲float提升爲double。這些被稱爲默認參數 促銷。 ...
¶7...函數原型聲明符導致 參數類型轉換到停止的最後一個聲明參數後省略號表示法。在結尾參數上執行默認參數 促銷。
整數優惠在第6.3.1節
定義¶2以下可以在表達式中用於任何一個或
int
unsigned int
可以使用:
- 的物體或表達整數轉換等級小於或等於
int
和unsigned int
的整數類型(除int
或unsigned int
之外)。- 類型
_Bool
,int
,signed int
或unsigned int
的位字段。如果
int
可以表示原始類型的所有的值(由寬度爲受限制,對於一個 位字段),該值被轉換爲int
;否則,它將轉換爲unsigned int
。這些被稱爲整數促銷。58)所有其他類型均由 整數升級不變。¶3整數提升保留包括符號在內的值。如前所述,是否將 'plain'
char
視爲帶符號是由實現定義的。58)整數優惠只應用:如通常的算術轉換的一部分,某些 參數表達式,以一元
+
,-
,和~
運營商的操作數,並且向 的兩個操作數按照其各自的條款的規定進行班次運營。
整數等級在10個項目符號的部分的¶1中定義。
@chux我查了一下,確實,'的putchar(EOF);''輸出0xff' –
@IgorLiferenko:是的,但檢查它做什麼你的系統上並沒有真正證明什麼。該標準表示'putchar(c)'相當於'putc(c,stdout)',這又相當於'fputc(c,stdout)'。指定'fputc'將其第一個參數轉換爲'unsigned char'。 'EOF'通常'-1'(儘管不能保證),並將該值轉化爲無符號'產量char''UCHAR_MAX',這是typicaly'0xff'。無論如何,將'EOF'傳遞給'putchar()'沒有多大意義。 –
@KeithThompson這是爲了說明已刪除的註釋,無論int或signed char變量傳遞給fputc(),fputc()的參數都轉換爲unsigned char。 。而且我在負數的角色中使用了'EOF',因爲它在我的系統中被認爲是'-1'。 –
我認爲喬納森的回答太簡單了。事情稍微更理性。我認爲,沒有任何的庫函數,其處理單 字符char
(僅適用於int
)工作,因爲即使他們中的一些不使用EOF
,我們不能讓其類型char
沒有 越來越像
void f(char c) { ...
...
char x = 't';
f((unsigned char)x);
...
warning: conversion to ‘char’ from ‘unsigned char’ may change the sign of the result
類型轉換警告
(因爲人們通常強制轉換爲unsigned char,以確保代碼可移植性,考慮到這樣一個事實:char
的符號性是不確定的。) 所以,唯一的選擇就是讓int
。
- 1. 爲什麼fputc()當putc()?
- 2. putc和putchar的性能?
- 3. 爲什麼putchar,toupper,tolower等取int而不是char?
- 4. 「char」類型的參數與char類型的參數不兼容*
- 5. 爲什麼不能模板非類型參數是類類型
- 6. 爲什麼參數類型的`putwchar()`,`fputwc()`和`putwc()`不是`wint_t`?
- 7. 爲什麼我們使用signed和unsigned char數據類型?目的是什麼?
- 8. 爲什麼不能有一個類型參數是什麼?
- 9. 不能將類型'char'隱式轉換爲類型Test <char>,爲什麼?
- 10. 什麼是C++中的char()類型?
- 11. Haskell代碼和類型的參數數量不同,爲什麼?
- 12. char str []和char * str作爲函數參數有什麼區別?
- 13. 爲什麼函數memchr()使用`int`作爲`char`類型的參數?
- 14. 爲什麼「decimal」不是有效的屬性參數類型?
- 15. 爲什麼std :: future模板參數類型是引用類型?
- 16. 爲什麼數據類型byte,char和short需要
- 17. FileBasedSink的類型參數是什麼?
- 18. 需要的類型參數是什麼?
- 19. 什麼是類型和什麼是類型構造函數scala
- 20. 爲什麼我不能使用char作爲函數的參數?
- 21. 爲什麼這種類型不能分配給參數類型?
- 22. 爲什麼這些類型參數不符合類型細化?
- 23. 爲什麼這種類型不允許使用類型參數?
- 24. 爲什麼gcc不會爲int和char產生類型不匹配的警告?
- 25. 類型'char *'但參數的類型'char'也有數據不打印到文件
- 26. 爲什麼不檢測我的參數化類的類型?
- 27. 期望'char **',但參數的類型是'char *'--argv
- 28. C錯誤:格式'%s'需要類型爲'char *'的參數,但參數2的類型爲'char(*)[100]'
- 29. 什麼部分是參數化類型?
- 30. 參數化類型是什麼意思?
由於你的第二個鏈接說它是因爲'wchar_t'必須能夠存儲元值,如EOF,但'char'不能。所以那些需要'char'的人需要採用'int'來代替元數據。這在c中很常見。 – LambdaBeta
@LambdaBeta第二個鏈接的第一個句子完全違反了答案的其餘部分,並且事實上是錯誤的。 –
@LambdaBeta爲什麼在地球上** wint_t **被引入呢? –