首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果for &*x都没有计算,那么为什么不对*&x有相同的规则呢?

如果for &*x都没有计算,那么为什么不对*&x有相同的规则呢?
EN

Stack Overflow用户
提问于 2022-02-09 18:31:57
回答 2查看 77关注 0票数 2

C2x,6.5.3.2地址和间接操作符,语义,3:

一元&运算符产生其操作数的地址。如果操作数具有" type“类型,则结果具有”指向类型的指针“类型。如果操作数是一元*运算符的结果,则既不计算该运算符,也不计算&运算符,结果就好像两者都被省略了一样,但对运算符的约束仍然适用,并且结果不是lvalue。

如果对于&*x*&都没有计算,那么为什么*&x没有相同的规则呢?即一元*算子的相同规则。

EN

回答 2

Stack Overflow用户

发布于 2022-02-09 18:44:56

因为值可能会改变,所以引用不会。

代码语言:javascript
复制
int foo(volatile int x)
{
    return *&x;
}


int *bar(volatile int *x)
{
    return &*x;
}
代码语言:javascript
复制
foo:
        mov     DWORD PTR [rsp-4], edi
        mov     eax, DWORD PTR [rsp-4]
        ret
bar:
        mov     rax, rdi
        ret

有趣的是,将对此进行评估(仅限于&):

代码语言:javascript
复制
int *bar(int * volatile x)
{
    return &*x;
}

所以我之前的观点是无效的

票数 2
EN

Stack Overflow用户

发布于 2022-02-17 12:31:39

x&*x之间的等价是由N721强制执行的,这使得一些以前具有UB定义的代码得到了很好的定义。

x是一个有效的lvalue或一个函数(在C中不被认为是lvalue )时,*&x已经等价于x,而没有任何其他规则。编译器可能会以不同的方式对待它们,但他们可以自由地不这样做。

即使x是易失性限定的,&x也不执行易失性读取,只生成一个volatile T*类型的指针值(类型本身不易失性)。然后,它本身的间接不形成易失性访问,只使用结果,这与使用简单的x相同。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71054917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档