0

该部分6.5.2.5/4提供了有关postfix-expression表单的说明( type-name ) { initializer-list }。这里是:

如果类型名称指定一个未知大小的数组,则大小由 6.7.9 中指定的初始化列表确定,复合文字的类型是完整数组类型的类型。否则(当类型名称指定对象类型时),复合文字的类型是类型名称指定的类型。无论哪种情况,结果都是lvalue.

我不明白措辞the type of the compound literal。文字怎么可能有类型?对应的未命名对象的类型是指的the type of the compound literal吗?

例如

long long *longs = (long long []) {1333, 3123, 3, 122};

这里initializer-list用于初始化类型为 的未命名对象long long [4]

也不清楚 . 的目的是什么In either case, the result is an lvalue。当在右操作数上使用时assignment-expressionlvalue conversion它不再是左值。

4

2 回答 2

2

据推测,“复合文字”是指使用“复合文字”语言结构指定的对象/值。值/对象在 C 中具有类型。

使复合文字左值的目的是使代码能够 int *x = &(int){42}; *x = 43;正常工作。它使复合文字的行为有点像匿名变量。(但不完全。与常规变量不同,复合文字不能有存储类说明符,我个人认为这是语言缺陷。)

于 2019-08-12T10:26:22.077 回答
2

复合字面量的主要目的是提供一个匿名对象,因此您可以拥有指向真实对象的指针,而无需先创建变量。

它是一个左值,这意味着可以获取它的地址。但是,它不是可修改的左值,就像普通的数组对象一样:

int a[] = {0, 0};
a = {1, 2}; // error, a is not a modifiable lvalue

但当然,您可以使用下标运算符或间接指针访问来修改它:

a[0] = 1; // fine
(long long []) {1333, 3123, 3, 122}[0] = 1; // fine as well
于 2019-08-12T10:26:45.883 回答