2013-10-29 28 views
18
#include<stdio.h> 
int main() 
{ 
    printf("%d", sizeof('a')); 
    return 0; 
} 

爲什麼上面的代碼在C和C++中編譯時會產生不同的結果? 在C中,它在C++中打印4,這是更可接受的答案,即1.
當我用主函數中聲明的char變量替換sizeof()內的'a'時,兩種情況下的結果都是1!C&C++中sizeof()運算符的返回值

+3

是什麼讓'1'多了一個可以接受的答案'4'? – Paddyd

+0

@Paddyd因爲在C和C++中'sizeof(char)'都是'1'? –

+0

@Paddyd因爲字符的大小!這種差異是我不知道的,所以1很明顯 – mac93

回答

30

因爲,這可能令人震驚,C和C++是不是相同的語言

C將字符文字定義爲類型爲int,而C++認爲它們的類型爲char

這是多字符常量可能是有用的一個案例:

const int foo = 'foo'; 

這將產生一個整數,其值將可能取決於字節順序和編譯器的心情6713199或7303014。換句話說,多字符字符文字不是「便攜式」,你不能依賴於容易預測的結果值。正如評論者指出的(謝謝!)這在C和C++中都是有效的,看起來C++使得多字符字符文字變成了另一種類型。聰明!

另外,作爲一個小問題,我想提及關於主題的時候,請注意sizeof不是函數,size_t的值不是int。因此:

printf("the size of a character is %zu\n", sizeof 'a'); 

,或者,如果你的編譯器太老不支持C99:

printf("the size of a character is %lu\n", (unsigned long) sizeof 'a'); 

代表來打印你所研究的尺寸最簡單,最正確的方法。

+0

[多字符文字在C++中也是合法的](http://stackoverflow.com/q/19394141/1009479) –

+1

C++也有多字符文字,類型'int'和實現定義的值。 –

+0

爲什麼我會在使用'%zu'時得到'警告:未知的格式轉換類型字符'z'? – noufal

2

在C中,'a'是一個字符常量,它被視爲一個整數,所以您得到的大小是4,而在C++中它被視爲一個字符。

可能重複的問題Size of character ('a') in C/C++

0

您的例子是返回單個字符(如getch)返回和int,因爲這允許空間的EOF標記的情況下,C++是不兼容C.在C的API一個(-1)。所以出於這個原因,它把'c'視爲一個整數。

C++引入了操作符和函數重載,這意味着我們可能要處理

cout << 'c' 

不同,以:

cout << 99