2011-11-09 92 views
16

事實證明char c[] = {"a"};C++03C++11中都是完全有效的。爲什麼包含字符串常量的初始化程序有效初始化一個char數組?

我不希望它是,因爲它是char而不是char const*的數組,我期望一個括號初始化程序要求它的每個「項目」都有一個兼容的類型。它有一個項目,這是一個char const*而不是一個char

那麼是什麼讓這個初始化有效?是否有這樣的理由?


同樣,char c[] = {"aa"};編譯,並打印c結果在輸出 「aa」。

期望char c[]{"a"}是在C++ 11,當然有效,但它是不一樣的!同樣,char c[] = {'a'}在兩者中都是顯而易見的,因爲是char c[] = "a"

+0

你嘗試過'char c [] = {「aa」};'? –

+0

@VJo:同樣有效。 –

+0

你爲什麼期望它是無效的?真的不清楚你在問什麼。這是有效的,因爲沒有規則禁止它。你會期望禁止它的哪一條規則? – jalf

回答

3

標量類型也可以使用花括號進行初始化(就像結構和數組一樣)。

struct S { int x, char c }; 
S s = {5, 'a'}; 

int arr[] = {5, 6, 7}; 

/* (my guess) out of consistency */ 
int z = { 4 }; 

而且因爲字符串文字可以被分配到字符數組的指針和

char arr[] = "literal"; 
char* ptr = "another"; 

似乎擬合允許char arr[] = { "literal" };了。

+0

Aha!我認爲這是有道理的。所以當我真的是一個標量的時候,我被掛在了總體的初始化者身上? (如果你得到我的漂移)我們正在「觀察」文字作爲一種標量? –

+0

是的,至少我認爲這是它的起源。但我不在C標準委員會:)只是猜測... – Pieter

+0

好吧;謝謝! –

5

雖然它可能不一定是直觀的,但它只是是允許的;兩種標準都有明確的規定:

[2003: 8.5.2/1]:A char array (whether plain char , signed char , or unsigned char) can be initialized by a string-literal (optionally enclosed in braces); a wchar_t array can be initialized by a wide string-literal (optionally enclosed in braces); successive characters of the string-literal initialize the members of the array. [..]

[n3290: 8.5.2/1]:A char array (whether plain char , signed char , or unsigned char), char16_t array, char32_t array, or wchar_t array can be initialized by a narrow character literal, char16_t string literal, char32_t string literal, or wide string literal, respectively, or by an appropriately-typed string literal enclosed in braces. Successive characters of the value of the string literal initialize the elements of the array.

雖然我不能解釋爲什麼委員會這樣做。

+0

嗯,這是一個很好的接觸。現在你可以寫'char a [] =「abc」;','char b [] = {「abc」};'和'char c [] {「abc」};'... –

+0

@KerrekSB:我不明白這有什麼用處! –

+0

'我無法解釋委員會爲什麼這樣做,儘管'你可以在問題中加上這個問題,因爲這個問題還沒有得到解答。可以說,大多數答案都會說'因爲標準是這麼說的',但也許可能有一些好的答案來這可能只是告訴'爲什麼?' –

0

我想這是C兼容性?實際上,T x = { value of T };也適用於其他類型的T。在C99標準中,

6.7.8/11: The initializer for a scalar shall be a single expression, optionally enclosed in braces.

6.7.8/14: An array of character type may be initialized by a character string literal, optionally enclosed in braces.

6.7.8/15: An array with element type compatible with wchar_t may be initialized by a wide string literal, optionally enclosed in braces.

我不知道爲什麼C有這個雖然。

+0

情節變厚。 –

+0

至於你的第二句話,你是什麼意思? 'int main(){int i = 3; int * ptr =&i; int x [] = {ptr}; }' - >'錯誤:從'int *'到'int'的無效轉換(如預期的那樣,並且正如我最初用'char'所預期的那樣...並不是指針在這裏的使用等同於文字無論如何,但你知道我的意思......我相當肯定這是'char'的特殊情況)。 [編輯:沒關係;只是意識到整個報價澄清了你所說的,確切地說。我會說「種」而不是「類型」:)] –

+0

@ TomalakGeret'kal:我只是指'int * x = {ptr};'。指針不能隱式轉換爲數組。而字符串文字是一個數組類型(第6.4.5節)。 – kennytm