2012-09-28 96 views
0

我有是這樣一個代碼:鑄造語法練習

int main(void) 
{ 
    char mychar = 'd'; 
    int *ptr = malloc(sizeof(*ptr)) ; 

    *ptr = (char) 'c' ; // *ptr = (char*) 'c'; Gives the exact same result 

    printf("%c\n",*ptr); 
    memset(ptr,mychar,sizeof(*ptr)); 
    printf("%c\n",*ptr); 
    free(ptr); 
    printf("%c\n",*ptr); 
    return 0 ; 
} 

的代碼提供指針樣式轉換和數據類型投相同的結果。
這兩種風格中哪一種應該使用或被認爲是一種好的做法,爲什麼?

*ptr = (char) 'c' ; 
*ptr = (char*) 'c'; 
+2

試圖打開你的編譯器警告? – Mat

+1

我認爲他們都不是很好,因爲你正在給int分配一個char。 – Heisenbug

回答

7

都不是。

*ptr'c'都是int類型。沒有演員是必要的。

(是的,在C字符常量是int類型,而不是char的,這是違反直覺的,但也有其歷史原因的。需要注意的是C++字符常量是char類型。)

*ptr = (char) 'c';演員是相對無害的;它會將int的值'c'轉換爲char,並且結果會隱式轉換回int。由於c保證可表示爲char,因此不會導致錯誤。

*ptr = (char*) 'c';,你的編譯器應該給你一個錯誤信息。您將常量int值轉換爲指針,然後將該指針值分配給int而不進行強制轉換。這是「違反約束條件」,這意味着符合標準的編譯器必須對其進行診斷。如果你的不這樣做,找出如何讓它這樣做。

如果作業經過編譯器,它可能會可能做你想做的。整數類型和指針類型之間的轉換通常只是重新解釋指定表示的位,因此將int轉換爲char*並返回int很可能會爲您提供原始的int值。但不能保證。

即使在不同的算術類型之間,轉換通常也是不必要的。例如,如果你這樣寫:

char ch = 'c'; 
int i; 
i = ch; 

在這種情況下,分配的右側真的是char型的,因爲它是類型的對象,而不是一個字符常量的名稱。分配含蓄ch的值從類型char轉換爲類型int。您可能寫:

i = (int)ch; 

代替,但只是規定,將已沒有投做了同樣的轉換。而且很容易出錯;它引入了讓類型錯誤的機會,而不是讓編譯器爲你處理它。

一般情況下,鑄件應該被懷疑。

1

兩者都不好。

'c'其實是一個int。所以你不必投。您可以直接指定它:

*ptr = 'c'; 
+0

我會和Heisenbug一起去的:這兩個OP的陣容都是同樣糟糕的,因爲這兩個陣容實際上都不是左邊陣型。 – DevSolar