【发布时间】:2021-01-23 09:21:12
【问题描述】:
我正在阅读复合文字,我发现它们是左值。所以我怀疑你可以分配它们,所以我做了一个实验,我注意到这个编译没有警告gcc -Wall -Wextra -pedantic:
struct foo {
int x;
int y;
};
int main(void) {
(struct foo){0,0} = (struct foo){1,1};
}
这让我很困惑,因为我真的看不出任何这可能有用的情况。您什么时候想要将任何东西 分配给 复合文字?
或者它是一种常见的未定义行为?因为它看起来很像修改字符串文字。使用与上述相同的参数编译时不会出现警告:
struct foo *ptr = &(struct foo){0,0};
*ptr = (struct foo){1, 1};
char *str = "Hello";
*str = 'X'; // Undefined behavior
根据C standard 6.4.5.7修改字符串是未定义的行为
【问题讨论】:
-
知道您是否曾经做过关于 C 的公开测验是一件好事。看起来更像是一种新兴属性,而不是预期的功能。
-
C 从什么时候开始习惯于仅仅因为它们无用而禁止构造?
标签: c gcc lvalue compound-literals