c中带有指针的运算符优先级

问题描述 投票:3回答:5

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

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
5个回答
3
投票

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

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


3
投票

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

在K&R中,此技巧用于编写简明的memcpy版本。就像这样:

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

今晚回家后我会张贴正确的例子。

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


2
投票

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

这里有什么优先顺序?

* +​​+ array = x; //很明显

后缀表达式使用相同的优先级规则,因此相当容易。

强制转换运算符也是如此。

((somestruct *)x + 1;

首先进行转换,因为如果不是这样,则将变得没有意义

x +(int)1;


1
投票

在第一个示例代码段中,

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

[array_ptr首先递增地址,然后将从i * i计算出的值分配给* array_ptr,因为评估采用从右到左的顺序,即*(array_ptr ++)。

在第二段代码中,

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

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

因此,这两个代码段之间的值有所不同。


0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.