为什么包含字符串常量的初始化程序有效初始化一个char数组?
事实证明char c[] = {"a"};
在C++03和C++11中都是完全有效的。为什么包含字符串常量的初始化程序有效初始化一个char数组?
我不希望它是,因为它是char
而不是char const*
的数组,我期望一个括号初始化程序要求它的每个“项目”都有一个兼容的类型。它有一个项目,这是一个char const*
而不是一个char
。
那么是什么让这个初始化有效?是否有这样的理由?
同样,char c[] = {"aa"};
编译,并打印c
结果在输出 “aa
”。
我会期望char c[]{"a"}
是在C++ 11,当然有效,但它是不一样的!同样,char c[] = {'a'}
在两者中都是显而易见的,因为是char c[] = "a"
。
标量类型也可以使用花括号进行初始化(就像结构和数组一样)。
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" };
了。
Aha!我认为这是有道理的。所以当我真的是一个标量的时候,我被挂在了总体的初始化者身上? (如果你得到我的漂移)我们正在“观察”文字作为一种标量? –
是的,至少我认为这是它的起源。但我不在C标准委员会:)只是猜测... – Pieter
好吧;谢谢! –
虽然它可能不一定是直观的,但它只是是允许的;两种标准都有明确的规定:
[2003: 8.5.2/1]:
Achar
array (whether plainchar
,signed char
, orunsigned char
) can be initialized by a string-literal (optionally enclosed in braces); awchar_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 (whetherplain char
,signed char
, orunsigned char
),char16_t
array,char32_t
array, orwchar_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.
虽然我不能解释为什么委员会这样做。
嗯,这是一个很好的接触。现在你可以写'char a [] =“abc”;','char b [] = {“abc”};'和'char c [] {“abc”};'... –
@KerrekSB:我不明白这有什么用处! –
'我无法解释委员会为什么这样做,尽管'你可以在问题中加上这个问题,因为这个问题还没有得到解答。可以说,大多数答案都会说'因为标准是这么说的',但也许可能有一些好的答案来这可能只是告诉'为什么?' –
我想这是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有这个虽然。
情节变厚。 –
至于你的第二句话,你是什么意思? 'int main(){int i = 3; int * ptr =&i; int x [] = {ptr}; }' - >'错误:从'int *'到'int'的无效转换(如预期的那样,并且正如我最初用'char'所预期的那样...并不是指针在这里的使用等同于文字无论如何,但你知道我的意思......我相当肯定这是'char'的特殊情况)。 [编辑:没关系;只是意识到整个报价澄清了你所说的,确切地说。我会说“种”而不是“类型”:)] –
@ TomalakGeret'kal:我只是指'int * x = {ptr};'。指针不能隐式转换为数组。而字符串文字是一个数组类型(第6.4.5节)。 – kennytm
你尝试过'char c [] = {“aa”};'? –
@VJo:同样有效。 –
你为什么期望它是无效的?真的不清楚你在问什么。这是有效的,因为没有规则禁止它。你会期望禁止它的哪一条规则? – jalf