gpt4 book ai didi

c - 数组到指针的转换是否消除了间接运算符的评估?

转载 作者:行者123 更新时间:2023-12-04 12:12:08 24 4
gpt4 key购买 nike

Find size of array without using sizeof ,数组的大小是通过

计算的
int arr[100];
printf ("%td", (&arr)[1] - arr);

现在,为了指针运算的目的,arr 被认为是单元素数组的元素,所以

&arr + 1

是该(概念上的)单元素数组末尾后一位的指针,因此当减去 arr[0] 的地址时,arr< 中的元素数 得到。

(&arr)[1]中,该指针是间接运算符的操作数,

(&arr)[1] ≡ *(&arr + 1)

然后根据 6.3.2.1 (3) 将生成的数组表达式转换为 int*

到目前为止,还不错。但是6.5.6(8)最后一句(加法算子),

If the result points one past the last element of the array object, it shall not be used as the operand of a unary * operator that is evaluated.

禁止在那里评估间接运算符。

问题是间接运算符是否在

*(&arr + 1) - arr

(在这种情况下,该表达式会调用未定义的行为)或数组到指针的转换会破坏评估(在这种情况下一切都很好),例如获取地址 (&(*(&arr + 1) )) 或对其应用 sizeof 会..

最佳答案

我认为标准非常明确,* 运算符在这里被评估。评估的结果是一个永远不会转换为值的左值,但评估的结果仍然会被使用。

当使用 & 运算符立即获取地址时有一个特殊的异常(exception):在 &*x 中,其中 x 的类型为 T *, x 被评估,但 *& 运营商不是。在获取地址的运行时没有 T 类型的中间左值。因此,即使 x 是空指针或超出数组末尾的指针,&*x 也是有效的。

因为您没有使用 & 运算符来获取地址,所以该异常(exception)不适用。数组到指针的转换没有类似的异常,所以即使 x 是数组类型,如果 x *x 也是无效的实际上并不指向任何对象。

关于c - 数组到指针的转换是否消除了间接运算符的评估?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16021533/

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