在我写char str[] = "1"
时是char str[] = {'1', '\0'}
还是char str[] = {"1"[0], "1"[1]}
?
但是,从编译器的角度来看,由于"1"
是const char[2]
,所以这两个是可以互换的。如何定义?或者说,在C ++上下文中“字符串文字值的字符”到底是什么意思?
我在想的是,如果它是“字符串文字的元素”,它应该是第二个。但是该标准中的措辞似乎使其模棱两可。
或者也许:该标准的初衷是哪一个?还是只是因为它不影响实现的行为而明确地不在乎它?
答案 0 :(得分:3)
(您的初始标题同时提到了C和C ++;它们是不同的语言)
对"1"
之类的literal string进行了定义,表示char
-s的数组,以 NUL 字节结尾,因此char str[] = "1";
就像char str[] = {'1', '\0'}
一样,而文字"1"
表现得像一个char anonymous_str[]={'1',0};
这样的匿名数组。允许(但不是必需)编译器以"ab"
指针相等的方式编译"b"
和"ab"+1 == "b"
。
一个更微妙的问题是字符串元素的const
性质,等等。这在C和C ++中略有不同。在C语言中,由于历史原因,文字字符串具有类型为const
的非char
元素,不允许更改。因此,"abc"[1] = '.';
在C语言中是undefined behavior(其中"abc"
的类型是(char*)
或更确切地说是char[4]
),但是IIRC被禁止(输入错误) C ++(其中"abc"
的类型为(const char*)
或更准确地为const char[4]
)。
任何优秀的optimizing C ++编译器都可以像char str[] = {"1"[0], "1"[1]}
或char str[] = {'1', '\0'}
(按as-if rule)一样精确地处理char str[] = "1"
。
对于C11,请阅读其n1570标准和其§6.4.5 string literals。
对于C++11,请阅读其n3337标准和§2.14.5字符串文字。对于更高版本的C ++,请查找并参考其标准文档。
PS。正式地,n1570和n3337是草稿。实际上,它们是标准(但是必须购买官方文档)。