2016-11-21 36 views
3

有誰知道爲什麼的putchar()fputc()putc()參數類型不是char,但putwchar()fputwc()putwc()參數類型是wchar_t?另見thisthis爲什麼參數類型的`putchar()`,`fputc()`和`putc()`不是`char`?

+0

由於你的第二個鏈接說它是因爲'wchar_t'必須能夠存儲元值,如EOF,但'char'不能。所以那些需要'char'的人需要採用'int'來代替元數據。這在c中很常見。 – LambdaBeta

+0

@LambdaBeta第二個鏈接的第一個句子完全違反了答案的其餘部分,並且事實上是錯誤的。 –

+0

@LambdaBeta爲什麼在地球上** wint_t **被引入呢? –

回答

4

答案是'傳統'(或'歷史')。在C90標準之前,沒有函數原型和所有參數的所有功能都受到違約促銷規則,所以char被作爲intshort自動傳遞晉升爲int過了,floatdouble,同樣地,對於無符號類型)。該標準不能破壞現有的代碼,因此它保留了這些函數的類型。它在實踐中幾乎沒有什麼區別。即使您傳遞的值超出範圍,您傳遞的值也會被視爲字符類型。的fputc(int c, FILE *stream)說明書說:

fputc功能由c(轉換爲unsigned char)指定的字符寫入到輸出流指向由stream ...

默認促銷規則

§6.5.2.2函數調用

¶6如果ex表示被調用函數的壓縮類型不包含原型,整數提升在每個參數上執行,參數 的類型爲float提升爲double。這些被稱爲默認參數 促銷。 ...

¶7...函數原型聲明符導致 參數類型轉換到停止的最後一個聲明參數後省略號表示法。在結尾參數上執行默認參數 促銷。

整數優惠在第6.3.1節

定義¶2以下可以在表達式中用於任何一個或intunsigned int可以使用:

  • 的物體或表達整數轉換等級小於或等於intunsigned int的整數類型(除intunsigned int之外)。
  • 類型_Bool,int,signed intunsigned int的位字段。

如果int可以表示原始類型的所有的值(由寬度爲受限制,對於一個 位字段),該值被轉換爲int;否則,它將轉換爲unsigned int。這些被稱爲整數促銷58)所有其他類型均由 整數升級不變。

¶3整數提升保留包括符號在內的值。如前所述,是否將 'plain'char視爲帶符號是由實現定義的。

58)整數優惠只應用:如通常的算術轉換的一部分,某些 參數表達式,以一元+-,和~運營商的操作數,並且向 的兩個操作數按照其各自的條款的規定進行班次運營。

整數等級在10個項目符號的部分的¶1中定義。

+0

@chux我查了一下,確實,'的putchar(EOF);''輸出0xff' –

+0

@IgorLiferenko:是的,但檢查它做什麼你的系統上並沒有真正證明什麼。該標準表示'putchar(c)'相當於'putc(c,stdout)',這又相當於'fputc(c,stdout)'。指定'fputc'將其第一個參數轉換爲'unsigned char'。 'EOF'通常'-1'(儘管不能保證),並將該值轉化爲無符號'產量char''UCHAR_MAX',這是typicaly'0xff'。無論如何,將'EOF'傳遞給'putchar()'沒有多大意義。 –

+0

@KeithThompson這是爲了說明已刪除的註釋,無論int或signed char變量傳遞給fputc(),fputc()的參數都轉換爲unsigned char。 。而且我在負數的角色中使用了'EOF',因爲它在我的系統中被認爲是'-1'。 –

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

相關問題