【问题标题】:Operator precedence in c with pointers带指针的c中的运算符优先级
【发布时间】:2011-11-23 23:50:57
【问题描述】:

在以下情况下如何分析优先级。

for (i=0; i<20; i++)
{
    *array_p++ = i*i;
    printf("%d\n",*arr++);
}

下面的代码和上面的有什么不同。

for (int i=0; i<20; i++)
{
    *arr = i*i;
    printf("%d\n",*arr);
    arr++; 
    printf("%d\n",(int )arr);
}

我期待相同的输出,但 *arr 值的输出不同

【问题讨论】:

标签: c operator-precedence


【解决方案1】:

后缀运算符的优先级高于一元运算符,所以*x++被解析为*(x++);表达式x++(即x)的结果被取消引用。

*++x 的情况下,*++ 都是一元运算符,因此具有相同的优先级,因此运算符从左到右应用,即*(++x);表达式++x(即x + sizeof *x)的结果被取消引用。

【讨论】:

【解决方案2】:

引用Wikipedia后缀 ++ 在一元 * 之前绑定。这意味着您拥有*(arr++)。例如,在表达式*arr++ = 5 中,*arr 被赋值为 5,然后 arr 递增。

在K&R中,这个技巧用于编写memcpy的简洁版本。是这样的:

while (--size)
    *dest++ = *src++;

今晚回家后我会发布正确的例子。

编辑:显然,只有后缀 ++ 具有更高的优先级。维基百科说前缀 ++ 具有相同的优先级。

【讨论】:

  • 你的意思是strcpy: while (*dst++ = *src++);
  • 是的,类似的。我没有这本书,所以我从记忆中走出来。
  • @Oscar: 如果它是 *++arr 那么它会导致 segfault 。为什么?
  • @Imposter:手工完成外观的最后一次迭代。对事情发生的时间以及数组单元的编号方式要非常小心。
【解决方案3】:

考虑前缀递增时,很容易记住哪个优先。

这里有什么优先权?

*++数组 = x; // 很明显

后缀表达式的优先级规则相同,因此相当简单。

转换运算符也是如此。

(somestruct *)x + 1;

首先演员已经完成,因为如果不是以下内容就没有意义

x + (int)1;

【讨论】:

  • 感谢您的回答:将近 2 岁的帖子 :-)
【解决方案4】:

运算符 ++ 和 * 具有相同的优先级 (postfix or prefix)。但是这种情况下的关联性是从右到左的。 所以在这样的情况下

*ptr++ ==>  *(ptr++) 
*++ptr ==> *(++ptr)
++*ptr ==> ++(*ptr)

此链接应为您提供有关运算符优先级及其关联性的更多信息。 http://www.isthe.com/chongo/tech/comp/c/c-precedence.html

【讨论】:

    【解决方案5】:

    在第一个示例代码sn -p中,

        for (i=0; i<20; i++)
            {
              *array_p++ = i*i;
               printf("%d\n",*arr++);
        }
    

    array_ptr 首先递增,即地址,然后从 i*i 计算的值分配给 *array_ptr,因为求值按从右到左的顺序进行,即 *(array_ptr ++)。

    在第二个示例代码sn-p中,

    for (int i=0; i<20; i++)
    {
      *arr = i*i;
    printf("%d\n",*arr);
     arr++; 
    printf("%d\n",(int )arr);
    }
    

    从 i*i 计算的值首先被计算并分配给 *arr,然后指向 arr 的指针递增。

    因此 2 个代码 sn-ps 之间的值存在差异。

    【讨论】:

    • 感谢您的回答:将近 2 年的帖子
    猜你喜欢
    • 2019-06-06
    • 2013-05-26
    • 2014-01-24
    • 1970-01-01
    • 2021-08-18
    • 2013-02-09
    • 1970-01-01
    相关资源
    最近更新 更多