【问题标题】:The behavior of unary & operator when met []一元 & 运算符遇到 [] 时的行为
【发布时间】:2020-02-16 11:25:48
【问题描述】:

我一直在阅读 C11 6.5.3.2 p3

一元 & 运算符产生其操作数的地址。如果操作数的类型为“type”,则结果为 键入“类型指针”。如果操作数是一元 * 运算符的结果,则该运算符和 对 & 运算符求值,结果就好像两者都被省略了,除了对 运算符仍然适用,结果不是左值。同样,如果操作数是 [] 的结果 运算符,既不计算 & 运算符,也不计算 [] 所隐含的一元 * 并且结果 就好像删除了 & 运算符并将 [] 运算符更改为 a+ 运算符。否则, 结果是指向其操作数指定的对象或函数的指针。

虽然反复阅读,但我无法理解这一段的大部分内容。
我的问题部分是* that is implied by the [][]operator were changed to a + operatorfunction designated by this operand。这一段是在讲&,但是为什么在说[]之后会出现*和术语“指定的功能”。而[] operator were changed to a + operator 似乎试图说出数组的定义:E1[E2] = *((E1) + (E2)) 这些行是什么意思?我需要一些帮助。

【问题讨论】:

  • 对于任何指针数组a和索引i,表达式a[i]正好等于*(a + i)
  • 这是否回答了您的问题stackoverflow.com/questions/53656118/…
  • 否则(如果一元 & 未与 *[] 组合),则结果(一元 y)是指向对象 (&object) 的指针或由其操作数(objectfunction)指定的函数 (&function)。清除吗?
  • @PSkocik 好的,Otherwise, the result is a pointer to the object or function designated by its operand. 现在很清楚了。但是我之前的句子还是有问题
  • @TarekD:不是重复的。这是关于特定点的语言律师问题。这是一个关于新阅读 C 标准级别的不那么迂腐的问题。

标签: c


【解决方案1】:

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

一元&应用于一元*的结果,取消*并将原始*的操作数转换为r值:

#include <assert.h>
int main()
{
    int *p=&(int){42};
    assert(&*p == p); //the value (42) is not fetched from the target
    #if 0
        &*p = &(int){1000}; //not OK; & cancels the * but converts p to an r-value (can't be on the left-hand side of an assignment)
    #endif
    p = &(int){1000}; //ok; p is an l-value (can be on the left hand side of an assignment)
    //(more accurately: can have its address taken)
}

现在,由于 pointerOrArray[index] 表达式被定义 (6.5.2.1p2) 为 *(pointerOrArray+index)(一元 * 的结果,除了 * 被隐藏),您可以对其应用相同的规则:@ 987654332@ (pointerOrArry+Index)。这就是你引用的第一句话所说的。

您引用的最后一句话可以(在6.5.3.2p3 的上下文中)解释为:

否则(如果一元 &amp; 未与 *[] 组合),则(一元 &amp;)的结果是指向对象 (&amp;object) 或函数 (&amp;function) 的指针) 由其操作数(objectfunction)指定。

【讨论】:

    【解决方案2】:

    [来自评论] 我不确定[] 的含义。它没有写成array[i],只是[]

    C 标准使用[] 表示下标运算符。虽然它在源代码中显示为E1[E2],其中E1E2 代表表达式,但[] 字符是识别它的基本方式,它们指定了数组下标操作。

    [C 2011, draft N1570, 6.5.3.2 3, Discussioning the unary &amp; operator] … 同样,如果操作数是 [] 运算符的结果,则既不是 &amp; 运算符也不是一元 @987654333对 [] 隐含的 @ 进行评估,结果就像删除了 &amp; 运算符并将 [] 运算符更改为 + 运算符一样。否则,结果是指向其操作数指定的对象或函数的指针。

    回到[] 运算符,考虑一个表达式E1[E2]。 6.5.2.1 2 中对下标运算符的定义与(*((E1)+(E2))) 相同。 (换句话说,它获取指针E1 并为其添加下标E2,然后应用* 以获取该位置的元素。或者,由于+ 是可交换的,E2 可以是指针,E1 可以是下标。)所以“[] 所隐含的一元*”就是(*((E1)+(E2))) 中的*

    因此,当我们将&amp; 应用于E1[E2] 时,这段话告诉我们将其视为&amp;(*((E1)+(E2))),并且&amp;* 都不会被评估,所以就好像它是((E1)+(E2)).

    …为什么…[the] term "function specified"出现…

    包含“指定功能”的句子是单独的。 “否则”告诉我们它所讨论的情况不是&amp; 应用于下标表达式(来自前面的句子)或一元* 表达式(来自前面的两个句子)。所以我们只有&amp;E,其中E 不是*E1E1[E2]。这句话说“否则,结果是指向其操作数指定的对象或函数的指针。”如果E 是一个对象,那么&amp;E 是一个指向该对象的指针。如果E 是一个函数,那么&amp;E 是一个指向函数的指针。

    【讨论】:

      猜你喜欢
      • 2014-03-31
      • 2017-02-03
      • 1970-01-01
      • 1970-01-01
      • 2018-09-18
      • 2016-01-13
      • 2021-08-14
      • 2019-05-18
      • 1970-01-01
      相关资源
      最近更新 更多