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修改的.
所以它似乎作为复合文字的数组是左值而不是常量值.
这是一个左值,我们可以看到这个,如果我们看一下它所说的C99标准部分6.5.2.5 复合文字(强调我的):
如果类型名称指定了未知大小的数组,则大小由6.7.8中指定的初始化程序列表确定,复合文字的类型是已完成数组类型的类型.否则(当类型名称指定对象类型时),复合文字的类型是由类型名称指定的类型.在任何一种情况下,结果都是左值.
如果你想要一个const版本,稍后在同一部分中给出了以下示例:
示例4可以通过以下结构指定只读复合文字:
Run Code Online (Sandbox Code Playgroud)(const float []){1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6}
我们可以在Dobb博士的文章The New C:Compound Literals中找到对术语的解释,并说:
复合文字不是真正的常量,因为文字的值可能会改变,如后面所示.这给我们带来了一些术语.C99和C90标准[2,3]对代表使用"常量"一词,代表真正不可改变的值,这些值在语言中是不可能修改的.因此,10和3.14分别是整数十进制常数和double类型的浮点常数.单词"literal"用于表示可能不那么恒定的值.例如,早期的C实现允许修改引用字符串的值.C90和C99禁止这种做法,因为任何程序都比修改字符串文字具有未定义的行为,这是标准说它可能有用的方式,或者程序可能以神秘的方式失败.[...]