【问题标题】:Understanding indirection through pointers and taking address通过指针理解间接并获取地址
【发布时间】:2019-05-14 07:25:48
【问题描述】:

在标准N1570Section 6.5.3.2#3 中指定了以下内容(emp. mine):

如果操作数是一元 * 运算符的结果,则 运算符和 & 运算符都被计算,结果就像两者一样 被省略,除了对运算符的约束仍然适用 并且结果不是左值

稍后在6.5.3.2#4 部分指定:

如果操作数指向一个函数,则结果是一个函数 代号;如果它指向一个对象,结果是一个左值 指定对象

这两个部分在我看来是矛盾的。我引用的第一个指定result is not an lvalue,但第二个指定间接运算符的结果是一个左值。

你能解释一下吗?这是否意味着在对象的情况下,运算符*& 不会相互消除?

【问题讨论】:

  • 在您的第一次引用中省略前两句话并没有帮助传达标准的该部分实际涵盖的内容。该引用详述的具体案例与&*var 形式有关,其中var 是指向某个对象的类型指针,

标签: c pointers language-lawyer unary-operator


【解决方案1】:

第 6.5.3.2#3 节讨论一元 & 运算符,第 6.5.3.2#4 节讨论一元 * 运算符。他们有不同的行为。

细化(from comment):

关键是一元 & 不会产生左值,即使在它被视为省略的情况下,因为它在取消引用上下文中直接位于一元 * 之前。仅仅因为两个运算符都被认为是省略并不会改变结果表达式不是左值的事实;同样,如果应用单独的一元 & 则不会。

int a; 
&a = ...; 

不合法(显然)。但也不是

int a; 
&*a = ...;

仅仅因为它们被视为省略并不意味着 &* 与单独的 a 左值等效。

【讨论】:

  • 来自6.5.3.2#3 的引用我提供了关于遗漏&* 的讨论,而不仅仅是&。确切地说是关于&*var,其中是指向int 的指针。 6.5.3.2#4 表示*var 的结果是lvalue
  • @St.Antario 我不知道你在做什么。关键是,像 &*var 这样的表达式不会产生左值,否则,它可能会被用作赋值运算符的 LHS。
  • @St.Antario 关键是一元 & 不会产生左值,即使在被认为省略的情况下,因为它在取消引用上下文中直接位于一元 * 之前。 IE。仅仅因为两个运算符都被认为是省略并不会改变结果表达式不是左值的事实;同样,如果应用单独的一元 & 则不会。 IE。 int a; &a = ...; 不合法(显然)。但int a; &*a = ...; 也不是。仅仅因为它们被认为是省略并不意味着 &* 是左值等效于单独的 a
  • @WhozCraig 以大约 5 秒的优势击败了你。 :)
  • @SouravGhosh 我打算把所有这些都放在一个答案中,但老实说,我在看你是否先修饰你的。显然对于 OP 的选择已经足够了,所以我没有打扰。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-03
  • 2021-06-03
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多