带指针的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)
; 表达式++x
( x + 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