gpt4 book ai didi

c - & 后跟 * 运算符的行为

转载 作者:太空狗 更新时间:2023-10-29 16:34:10 28 4
gpt4 key购买 nike

我对地址运算符后跟解引用运算符的行为有疑问。

让我们看一下表达式 &*p,其中 p 的类型为 int *

C11 标准(第 6.5.3.2 节)说:

The unary & operator yields the address of its operand. If the operand has type ‘‘ type ’’, the result has type ‘‘pointer to type ’’. If the operand is the result of a unary * operator, neither that operator nor the & operator is evaluated and the result is as if both were omitted, except that the constraints on the operators still apply and the result is not an lvalue.

加上脚注:

Thus, &*E is equivalent to E (even if E is a null pointer), and &(E1[E2]) to ((E1)+(E2)). It is always true that if E is a function designator or an lvalue that is a valid operand of the unary & operator, *&E is a function designator or an lvalue equal to E. If *P is an lvalue and T is the name of an object pointer type, *(T)P is an lvalue that has a type compatible with that to which T points. Among the invalid values for dereferencing a pointer by the unary * operator are a null pointer, an address inappropriately aligned for the type of object pointed to, and the address of an object after the end of its lifetime.

显然 &*p 必须等于 p 除了 &*p 不是左值。

如果我们现在考虑类型为 int[10]a&*a 是什么类型?例如 sizeof asizeof &*a 之间应该有区别吗?

一方面,如果我们评估 &*aa 会通过取消引用运算符衰减为 int * 它将变成 int 然后使用地址运算符 int *

另一方面,如果 &*a 表现得“好像两者都被省略了”,则类型应该是 int[10]

example表明 gcc 对待表达式不同:

#include <stdio.h>

int main(void)
{
int a[10];

printf("%zu\n%zu\n", sizeof a, sizeof &*a);

return 0;
}

输出:

40
8

这是否符合 C11 标准?

也许是因为“对运算符的约束仍然适用”,解引用运算符的操作数必须是指针?

最佳答案

请考虑从数组到指向第一个元素的指针的转换是单独发生的,并且发生在应用 * 之前。尽管在 C 实现确定它是 sizeof 还是 & 的操作数之前,不会做出是否将数组转换为指针的决定(根据 C 2018 6.3.2.1 3)、这种转换不是*操作的一部分。因此,当我们检查 &* 时,操作数必须已经是一个指针。

此外,对 * 运算符的操作数的约束是它必须具有指针类型 (C 2018 6.5.3.2 2)。因此,操作数必须是指针,而不是数组。

“结果就好像两者都被省略了”这句话促使我们考虑如果两者都被省略了会是什么结果,但文本继续说“除了对运算符的约束仍然适用并且结果是不是左值。”由于约束仍然适用,操作数必须是一个指针;约束可以应用并且操作数可以是尚未转换为指针的数组在逻辑上是不一致的。

关于c - & 后跟 * 运算符的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53656118/

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