假设我用char c[99] = {'Stack Overflow'};C或C++ 编写.它编译好,但这是有效的吗?有效的我意味着不会调用任何未定义或未指定的行为.
再次,如果我写char c[99] = 'Stack Overflow';gcc抱怨多字符常量很明显,但在上面我封闭在大括号内编译器很高兴!为什么会这样?
我还注意到,puts(c);在第一个语句之后,输出'w'恰好是一般字符串的最后一个字符Stack Overflow.为什么这样?
有人可以分别解释这些行为吗?
Ben*_*igt 14
它们都只是一个文字,所以c[0]设置为文字和c[1]... c[98]填充零(NUL字符).
我认为实际上填入的值c[0]是依赖于实现的,但它至少应该在任何兼容的编译器上编译.
编辑:验证标准,至少在C++ 0x中:
多字符文字具有类型
int和实现定义的值.
在C99(使用草案,因为它是免费的):
包含多个字符(例如
'ab')的整数字符常量的值 ,或包含未映射到单字节执行字符的字符或转义序列的值是实现定义的.