2011-09-10 84 views
3

我有這樣的代碼:我爲什麼可以分配/比較int和字符用C

#include <stdio.h> 
main() 
{ 
int c; 
c = getchar(); 
while (c != EOF) { 
putchar(c); 
c = getchar(); 
} 
} 

C文檔中說,getchar()返回int值。在上面的程序中,我們將c類型分配爲int。最重要的是EOF是一個integer常量,在頭函數中定義。

現在,如果更改代碼是這樣的:

#include <stdio.h> 
    main() 
    { 
    char c; 
    c = getchar(); 
    while (c != EOF) { 
    putchar(c); 
    c = getchar(); 
    } 
    } 

此代碼也可以!等待一分鐘,根據C文檔getchar()返回int,但請參閱上面的代碼,我將它存儲在char中。而C編譯器不會拋出任何錯誤。並且在while循環中我比較了c這是一個charEOF這是一個int並且編譯器不會拋出任何錯誤並執行我的程序!

爲什麼編譯器不會在上述兩種情況下拋出任何錯誤?

在此先感謝。

+1

C不是動態的,它只是允許在數值類型之間進行隱式轉換。第二個代碼將字符'\ xFF'解釋爲EOF(在EOF == -1的系統上),但第一個不會,因此getchar使用int。 – ughoavgfhw

+1

爲什麼downvote? –

+1

@ughoavgfhw我不一定非得是'\ xFF',而且在'char'無符號的機器上,它可以被編譯爲一個無限循環。 –

回答

9

號它只是意味着返回值其爲int隱含轉換成char類型。就這些。

編譯器可能爲生成此類轉換的警告消息,因爲sizeof(int)大於sizeof(char)。例如,如果您有-Wconversion選項與GCC編譯代碼,它給了這些警告消息:

c.c:5:7: warning: conversion to 'char' from 'int' may alter its value 
c.c:8:8: warning: conversion to 'char' from 'int' may alter its value 

這意味着,你應該使用int避免這樣的警告消息。

+0

這是最好的使用方法?一個'char'還是'int'? –

+0

這也意味着代碼將無法工作。它似乎可以工作,但是您可以輕鬆地輸入正確的值以使其過早結束,或者如果您處於體系結構中,'char'未經簽名,它將永遠不會退出循環。 –

+1

@ Ant's:我更新了我的答案。 – Nawaz

3

號讓我們看一下wikipedia的定義

這些行爲可以包括在程序的擴展,通過添加新 代碼,通過擴展對象和定義,或通過修改類型 系統中,所有中程序執行。這些行爲幾乎可以用任何足夠複雜的語言來模擬,但動態語言 提供了直接使用它們的工具。

你已經證明了C/C++中的char和int幾乎相同,C/C++自動在兩者之間進行轉換。而已。這裏沒有修改類型系統。

4

恐怕在這種情況下,術語「動態編程語言」過於模糊地定義爲做出如此細緻的區分。

儘管我認爲隱式轉換爲一種數字類型不是一種動態語言功能,而只是語法糖。

1

讓重寫你的代碼來說明這是怎麼回事

int main(int argc, char** argv) 
{ 
    char c; 
    c = EOF; /* supposing getchar() returns eof */ 
    return (c == EOF) ? 0 : 1; 
} 

我應該該程序的返回值是什麼? EOF不是字符,而是將其轉換爲字符。當你進行比較時,該投射再次發生,並被壓扁至相同的值。重寫這個要清楚發生了什麼事情的另一種方法是:

#include <stdio.h> 
main() 
{ 
    int c; 
    c = getchar(); 
    while ((char)c != (char)EOF) { 
     putchar((char)c); 
     c = getchar(); 
    } 
} 

EOF是越來越壓扁;不管它如何被壓扁都沒關係,它可能會壓到字母'M'上,但是由於它每次都會以相同的方式壓扁,所以仍然會將其視爲EOF。

0

C會讓你做你想做的事,但你必須接受後果。如果你想給int分配一個int,那麼你可以。不會使它成爲一種動態語言。 (這個問題的標題應該是「爲什麼c讓我給char賦一個int?」,並且只包含最後一段,但可能這並不會引起足夠的重視。它已經吸引了任何upvotes然後我編輯標題,但因爲它不是我會留下它作爲一個例子,如何不問問題。)

+0

哈哈!對不起,這是一個新手問題,你肯定@andy我不會保留今後的標題! –

0

如果您不讀取7位ASCII數據,\ xFF可能是有效的數據。如果EOF是\ xFFFFFFFF並且您將getchar()的值返回給char,那麼您無法將EOF與\ xFF區分爲數據。

相關問題