c - 通过指针理解间接并获取地址
问题描述
在标准N1570中,Section 6.5.3.2#3
指定了以下内容(emp. mine):
如果操作数是一元 * 运算符的结果,则该运算符和 & 运算符都不会被计算,结果就像两者都被省略了,除了对运算符的约束仍然适用并且结果不是左值。
稍后在该部分6.5.3.2#4
指定:
如果操作数指向一个函数,则结果是一个函数指示符;如果它指向一个对象,则结果是一个指定该对象的左值 。
这两个部分在我看来是矛盾的。我引用result is not an lvalue
的第一个指定 ,但第二个指定间接运算符的结果是左值。
你能解释一下吗?这是否意味着在对象的情况下运营商*
并&
不会相互消除?
解决方案
第 6.5.3.2#3 节讨论一元运算&
符,第 6.5.3.2#4 节讨论一元运算*
符。他们有不同的行为。
详细说明(来自评论):
关键是 unary&
不会产生左值,即使在它被认为省略的情况下,因为它*
在取消引用上下文中直接位于 unary 之前。仅仅因为两个运算符都被认为是省略并不会改变结果表达式不是左值的事实;同样的,如果应用一个单独的一元则不会&
。
int a;
&a = ...;
不合法(显然)。但两者都不是
int a;
&*a = ...;
仅仅因为它们被认为是省略并不意味着&*
左值等效于 solo a
。
推荐阅读
- android - 在通话中注入文本到语音?[安卓]
- c++ - init-declarator 是纯右值表达式吗
- javascript - 如何使用 javascript 删除和添加 css 样式 - 添加的样式未反映在 UI 中
- python - 如何将不同的数据框写入 csv 文件的单独表格中?
- azure - 如何使用二级索引在 Azure 中存储和读取数百万条记录
- sql - 进行查询以显示访问中的最大数据
- java - 重载方法如何决定 Java 中的类型
- python - 从 Python3 中的字符串中删除非拉丁字符
- sql-server - 在服务器属性中更改 Microsoft SQL 日志的默认位置会导致意外行为或任何性能问题吗?
- python - 将 Pandas 数据帧从宽转长