为什么包含字符串常量的初始化程序有效初始化一个char数组?

问题描述:

事实证明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

标量类型也可以使用花括号进行初始化(就像结构和数组一样)。

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

好吧;谢谢! –

虽然它可能不一定是直观的,但它只是是允许的;两种标准都有明确的规定:

[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

'我无法解释委员会为什么这样做,尽管'你可以在问题中加上这个问题,因为这个问题还没有得到解答。可以说,大多数答案都会说'因为标准是这么说的',但也许可能有一些好的答案来这可能只是告诉'为什么?' –

我想这是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