gpt4 book ai didi

c - 复合文字的赋值有什么用?

转载 作者:行者123 更新时间:2023-12-03 14:13:36 25 4
gpt4 key购买 nike

我正在阅读复合文字,我看到它们是 l 值。所以我怀疑你可以分配它们,所以我做了一个实验,我注意到这个编译没有警告 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,修改字符串是未定义的行为

最佳答案

好吧,它可能没有用,但它是限制最少的一种。
由于非数组类型的非 const 限定复合文字 一个可修改的左值,并且可以将可修改的左值分配给您可以对可修改的左值执行的所有操作中,然后您可以分配给复合文字。
相反的情况是,对于复合文字的左值无法执行的操作,您会有一些额外的情况。

我发现了一个可以工作的用例,它会产生左值,但它不会:

既然您刚才说您不喜欢宏,那么我不确定这是否能说服您,但这使得编写一个扩展为类似的宏成为可能

foo(&((struct baz){0} = bar()))
这里 bar返回 struct baz作为值,和 foo需要一个指向这样的指针 struct作为论据。如果没有此功能,您将无法进行内联传递这样的值。

关于c - 复合文字的赋值有什么用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64260640/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com