c++ - 这是一个有效的 C 语句吗?

标签 c++ c gcc

假设我用 C 或 C++ 编写 char c[99] = {'Stack Overflow'};。它编译得很好,但这有效吗?有效是指不调用任何类型的未定义或未指定的行为。

再次,如果我写 char c[99] = 'Stack Overflow'; gcc 提示多字符常量,这很明显,但在上面,当我用大括号括起来时,编译器很高兴!为什么会这样?

我还注意到,在第一条语句之后的 puts(c); 将在 Stack Overflow 的位置输出一般字符串的最后一个字符“w”。为什么会这样?

有人可以分别解释这些行为吗?

最佳答案

他们都只是一个单一的文字,所以 c[0] 被设置为文字和 c[1] ... c[98] 用零填充(NUL 字符)。

我认为实际填充到 c[0] 中的值取决于实现,但它至少应该在任何兼容的编译器上编译。

编辑:根据标准验证,至少在 C++0x 中:

A multicharacter literal has type int and implementation-defined value.

在 C99 中(使用 the draft,因为它是免费的):

The value of an integer character constant containing more than one character (e.g., 'ab'), or containing a character or escape sequence that does not map to a single-byte execution character, is implementation-defined.

关于c++ - 这是一个有效的 C 语句吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4572409/

相关文章:

c++ - SIGABRT 和 SIGSEGV 有什么区别

c - 返回 1.0f 给我 1065353216

c - 确定以像素为单位的棋盘尺寸

c++ - 为什么下面的类模板在 Visual Studio 2019 中编译,而在 gcc 8.3 中没有?

c++ - 使用超时终止函数

c++ - 如何正确使用Qt QML Image Provider

C++ 类不生成匹配函数和已知转换错误

c - 声明是表达式吗?

c - 有没有办法忽略C预处理器输出顶部的定义(行标记)?

c - c程序中的隐藏错误(数值计算)