首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >后缀表达式(类型名称){初始化项-列表}

后缀表达式(类型名称){初始化项-列表}
EN

Stack Overflow用户
提问于 2019-08-12 10:06:17
回答 2查看 124关注 0票数 0

6.5.2.5/4一节提供了关于表单( type-name ) { initializer-list }postfix-expression的说明。下面是:

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

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

例如

代码语言:javascript
复制
long long *longs = (long long []) {1333, 3123, 3, 122};

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

此外,还不清楚In either case, the result is an lvalue的目的是什么。在assignment-expression中使用时,lvalue conversion是在右操作数上执行的,因此它不再是一个lvalue。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-12 10:26:22

想必,“复合文字”是指使用“复合文字”语言构造所指定的对象/值。值/对象在C中有类型。

生成复合文本lvalue的目的是使类似于int *x = &(int){42}; *x = 43;的代码工作。这使得复合文字的行为有点像匿名变量。(不过,并不是完全如此。与正则变量不同,复合文本不能有存储类说明符,我个人认为这是语言缺陷。)

票数 2
EN

Stack Overflow用户

发布于 2019-08-12 10:26:45

复合文字的主要用途是提供一个匿名对象,这样您就可以拥有一个指向真实对象的指针,而无需首先创建变量。

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

代码语言:javascript
复制
int a[] = {0, 0};
a = {1, 2}; // error, a is not a modifiable lvalue

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

代码语言:javascript
复制
a[0] = 1; // fine
(long long []) {1333, 3123, 3, 122}[0] = 1; // fine as well
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57459199

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档