这个问题已经有了答案:
Why are compound literals in C modifiable
1答
在C99中,我们可以使用复合文字作为未命名数组。
但是这个文本常量是否像100
,'c'
,123.4f
等。
我注意到我可以做到:
((int []) {1,2,3})[0] = 100;
而且,我没有编译错误,可以猜到这个未命名数组的第一个元素被100修改了。
所以它看起来像数组一样,复合文本是左值,而不是常量值。
最佳答案
它是一个左值,如果我们看一下它所说的复合文本(强调我的),我们可以看到这个:
如果类型名指定了未知大小的数组,则大小为
由6.7.8中指定的初始值设定项列表和类型确定
复合文字的是已完成数组类型的文字。否则
(当类型名指定对象类型时),则
复合文字是由类型名指定的文字。不管是哪种情况,
结果是一个左值。
如果您想要一个const版本,稍后在同一节中给出以下示例:
示例4只读复合文本可以通过
结构如下:
(const float []){1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6}
我们可以在Dobb博士的文章中找到对术语的解释,并说:
复合文本不是真正的常量,因为
文字可能会改变,如下所示。这让我们有点
术语。C99和C90标准[2,3]使用“常数”一词
对于表示真正不可更改的值的标记
无法在语言中修改。因此,10和3.14是一个整数
十进制常量和double类型的浮动常量。
单词“literal”用于表示
可能不是那么稳定。例如,早期的c实现
允许修改带引号的字符串的值。C90和C99
禁止这种做法,因为任何程序都不能修改字符串
字面上有未定义的行为,这是标准的说法
它可能工作,或者程序可能以一种神秘的方式失败。[…]