在C中,字符串是字符數組(char *
),字符通常存儲在char
中。我注意到libC中的一些函數採用了作爲整數而不是char的參數。爲什麼putchar,toupper,tolower等取int而不是char?
舉例來說,讓我們看看toupper()
和tolower()
這兩個函數都使用int
。該名男子網頁顯示:
如果c不是unsigned char值,或EOF,這些 函數的行爲是不確定的。
我的猜測是有int
,toupper
和tolower
能夠應付unsigned char
和EOF
。但實際上EOF
是在實踐中(是否有任何關於它的價值的規則?)可與char
一起存儲的值,並且由於這些函數不會將EOF
轉換成別的東西,所以我想知道爲什麼toupper
不會簡單地一個字符作爲參數。
在任何情況下,爲什麼我們需要接受不是字符的東西(如EOF)?有人能給我提供一個相關的用例嗎?
這與fputc
或putchar
類似,也取int
,無論如何轉換爲unsigned char
。
我正在尋找該選擇的確切動機。我想說服我,我不想回答,我不知道有人問我有一天有沒有問。
我不知道'EOF'必須適合'char'的任何規則,我可以向你保證'char'不保證被簽名,這會讓你討論使用'char' 'unsigned char'似乎是錯誤的。你的意思是'簽名字符'貫穿始終。 –
你看過這些函數的實現嗎?我認爲'int'參數是爲了優化目的,因爲它的字節大小非常適合處理器寄存器的大小。反過來,一個字節的'char'變量必須在幕後轉換爲'int',並且這個操作需要一些處理器時間來處理。 – sgnsajgon
閱讀此:[EOF的定義和如何有效地使用它](http://faq.cprogramming.com/cgi-bin/smartfaq.cgi?id=1043284351&answer=1048865140) –