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

如何分析以下情况的优先顺序。

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值的输出不同

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

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

引用维基百科 , postfix ++在unary *之前绑定。 这意味着你有*(arr++) 。 例如,在表达式*arr++ = 5*arr被赋值为5,则arr递增。

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

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

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

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

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

什么优先在这里?

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

后缀表达式使用相同的优先级规则,因此它非常简单。

对于演员来说也是如此。

(somestruct *)x + 1;

第一次演员表演完了,因为如果不是以下就没有意义

x +(int)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的指针递增。

因此,2个代码片段之间的值存在差异。

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

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

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