user-0 提问: c99

回复:
user: user-1
content: c++ 里面, "helloworld"类型是const char [11]   (或者 char const [11]), 自己用typeid试试就知道了(VS的智能感应鼠标指上去也行). c里面, 话说c的类型系统就是蛋疼, 也不用探究类型了, 反正又不能重载.

user: user-2
content: 引用 11 楼 paschen 的回复:"helloworld"我觉得应该是算const char[11]  至于数组类型之间是不能赋值的，但初始化的时候允许这种做法（虽然我不知标准上是否是这样认为）  这个const的依据是从哪里来的？ 数组类型之间不能赋值该怎么解释？ struct t {char a [22];} ta, tb; /* ... ... */ ta = tb; 这算不算是数组类型之间的赋值。

user: user-3
content: "helloworld"我觉得应该是算const char[11]  至于数组类型之间是不能赋值的，但初始化的时候允许这种做法（虽然我不知标准上是否是这样认为）

user: user-2
content: 字面串严格地说没有类型，只有字面上的形式的意义。在预处理阶段，它是一个预处理记号，预处理之后，它是一个记号（token），C实现用它初始化一个没有名字的静态数组。 如果字面串用做初始化器，那么，如果是初始化一个指针，则那个静态数组将自动转换为指向其首元素的指针；如果是初始化一个数组，则用那个静态数组的内容来初始化那个数组。 为了方便，在C标准文档里，将字面串看成是基本表达式。凡是可以出现数组类型表达式的地方，也可以使用字面串。所以，字面串通常可以看成是具有数组类型的表达式。

user: user-4
content: “变量赋值”和“变量初始化”不是一回事！ “变量赋值”发生在运行期，其写法遵循赋值语法规定。 “变量初始化”发生在编译期或运行期，其写法遵循初始化列表语法规定。

user: user-5
content: 引用 楼主 u011877771 的回复:c99 page 71面第6段： The multibyte character sequence is then used to initialize an array of static storage duration and length just sufficient to contain the sequence. 我靠，标准说了这是合法的，那就是合法的了，那问题就很复杂了，要么标准出现了不一致了，要么"helloworld"的类型不是数组类型，那么回到根本问题上，sizeof计算"helloworld"是怎么计算的？它的类型到底是什么呢？  说明 string literal 可以初始化数组不在这里，见 4 楼第二段引用。  标准既然要把它单独拿出来说，一般来说就是不能通过其它条文来解释的。

user: user-6
content: "helloworld"; 是 const char [11];类型 char arr[] = "helloworld"; 是常量字符串初始化字符数组，不是常量字符数组初始化字符数组的。

user: user-6
content: 引用 5 楼 akirya 的回复:我们都知道数组类型是可以转型为指针类型的，这句话是错误的，你查查标准有没退化这种说法么？  数组类型可以赋值给指针类型。 arr是数组类型，p是指针。完全不一样的东西。 额看错了。。。忽略这个吧

user: user-6
content: 我们都知道数组类型是可以转型为指针类型的，这句话是错误的，你查查标准有没退化这种说法么？  数组类型可以赋值给指针类型。 arr是数组类型，p是指针。完全不一样的东西。

user: user-5
content: ISO/IEC 9899:1999 6.4.5 String literals 5 In translation phase 7, a byte or code of value zero is appended to each multibyte character sequence that results from a string literal or literals.65) The multibyte character sequence is then used to initialize an array of static storage duration and length just sufficient to contain the sequence. For character string literals, the array elements have type char, and are initialized with the individual bytes of the multibyte character sequence; for wide string literals, the array elements have type wchar_t, and are initialized with the sequence of wide characters corresponding to the multibyte character sequence, as defined by the mbstowcs function with an implementation-defined current locale. The value of a string literal containing a multibyte character or escape sequence not represented in the execution character set is implementation-defined.  6.7.8 Initialization 14 An array of character type may be initialized by a character string literal, optionally enclosed in braces. Successive characters of the character string literal (including the terminating null character if there is room or if the array is of unknown size) initialize the elements of the array.

user: user-7
content: 第一句是个特殊语法 第二句就是一个语法糖

user: user-0
content: 引用 1 楼 u011877771 的回复:其实我个人认为是数组类型，至于用字符串去初始化数组为什么合法这个的确是不需要去探究了，就像 char arr2[] = { 'h', 'e', 'l', 'l', 'o', '\0' }; 这句一样合法，但是又能怎么解释呢？只能说当个语法记得就可以了 至于 arr2 = arr; 这句为什么不合法，那标准说它不合法，那我只能认为这个c99语言的语法本身不支持罢了 打错了 arr2 = arr不合法是因为arr2不能为左值，数组名不能作左值 正确的例子： char arr3[] = arr;

user: user-0
content: 其实我个人认为是数组类型，至于用字符串去初始化数组为什么合法这个的确是不需要去探究了，就像 char arr2[] = { 'h', 'e', 'l', 'l', 'o', '\0' }; 这句一样合法，但是又能怎么解释呢？只能说当个语法记得就可以了 至于 arr2 = arr; 这句为什么不合法，那标准说它不合法，那我只能认为这个c99语言的语法本身不支持罢了