gpt4 book ai didi

c - 获取条件表达式的地址

转载 作者:太空狗 更新时间:2023-10-29 15:31:12 24 4
gpt4 key购买 nike

我有以下代码:

struct S {
int x;
};

#define X(a, s) ((struct S*)(a ? &s : 0))

int main(void)
{
int a;
struct S s;
struct S *t;
int *x;

a = 3;
s.x = 4;

x = &(X(a, s)->x);
t = &(X(a, s));
}

当我编译这个时,我在最后一行得到一个错误:

test.c: In function ‘main’:
test.c:18:9: error: lvalue required as unary ‘&’ operand
t = &(X(a, s));
^

为什么“&(X(a, s)->x)”是有效代码,而“&(X(a, s))”不是?两者都涉及返回条件表达式的地址。

最佳答案

&(X(a, s))中,&应用于((struct S*)(a, &s : 0))。该表达式的类型是 struct S*,它是一个值(指向 struct S 的指针的值)。 & 不能应用于非左值的值。1

&(X(a, s)->x)中,&应用于((struct S*)(a, &s : 0 ))->x。该表达式采用指向 struct S 的指针,并使用它来引用成员 x,这是一个 int。它是一个左值,因为它指定作为成员 xint 对象(C 2018 6.5.2.3 4 明确表示 -> 的结果> 是一个左值)。因为它是一个左值,& 可以应用于它。

脚注

1 根据 C 2018 6.5.3.2 1,地址运算符 & 必须应用于函数指示符,[ ] 的结果或一元 *,或指定不是位域且未使用 register 声明的对象的左值。

关于c - 获取条件表达式的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56080709/

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