数组为复合文字

xde*_*000 4 c c99 compound-literals

在C99中,我们可以将复合文字用作未命名的数组.

但像例如,这字面常量100,'c',123.4f,等.

我注意到我能做到:

((int []) {1,2,3})[0] = 100;
Run Code Online (Sandbox Code Playgroud)

并且,我没有编译错误,并且可以猜测该未命名数组的第一个元素是用100修改的.

所以它似乎作为复合文字的数组是左值而不是常量值.

Sha*_*our 6

这是一个左值,我们可以看到这个,如果我们看一下它所说的C99标准部分6.5.2.5 复合文字(强调我的):

如果类型名称指定了未知大小的数组,则大小由6.7.8中指定的初始化程序列表确定,复合文字的类型是已完成数组类型的类型.否则(当类型名称指定对象类型时),复合文字的类型是由类型名称指定的类型.在任何一种情况下,结果都是左值.

如果你想要一个const版本,稍后在同一部分中给出了以下示例:

示例4可以通过以下结构指定只读复合文字:

(const float []){1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6}
Run Code Online (Sandbox Code Playgroud)

我们可以在Dobb博士的文章The New C:Compound Literals中找到对术语的解释,并说:

复合文字不是真正的常量,因为文字的值可能会改变,如后面所示.这给我们带来了一些术语.C99和C90标准[2,3]对代表使用"常量"一词,代表真正不可改变的值,这些值在语言中是不可能修改的.因此,10和3.14分别是整数十进制常数和double类型的浮点常数.单词"literal"用于表示可能不那么恒定的值.例如,早期的C实现允许修改引用字符串的值.C90和C99禁止这种做法,因为任何程序都比修改字符串文字具有未定义的行为,这是标准说它可能有用的方式,或者程序可能以神秘的方式失败.[...]

  • @ xdevel2000:文字不是常量(例如,切换案例所需); 它们可能是只读值.更改只读值是未定义行为:它可能在月亮满时起作用... (2认同)