++ * p和* p ++之间的差异

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了++ * p和* p ++之间的差异相关的知识,希望对你有一定的参考价值。

int *p,x=5;
p=&x;
x=++*p;
printf("%d\n",x);
x=*p++;
printf("%d\n",x);
x=++*p;
printf("%d",x);

尽管我知道前缀++首先增加该值,然后再存储它,而后缀++首先存储该值,然后再增加它。但是在最后一行中,为什么在printf语句中打印1?

感谢您的回答。

答案
  • x=++*p;将内容从5更改为6,然后将6存储在x中。 (前缀++和*具有相同的优先级,因此前缀运算符的运算符关联性从右到左起作用。)
  • x=*p++;意味着后缀++首先被评估,因为它具有更高的优先级。但是p的实际更改仅在执行整个表达式之后才会发生,因此*p的值6将在此之前存储在x中。

    请注意,++表示p现在指向实际有效存储位置之外的int。在C中允许这种指向超出已分配内容的第一项的特殊情况,只要未取消引用变量

  • x=++*p;在这里,该指针已取消引用,这是不允许的,因此这是一个bug(与++无关)。这是不确定的行为,任何事情都可能发生。对您而言,这次恰好打印1。对我来说,这次打印的是8958。但是,由于它是未定义的行为错误,因此程序还可能崩溃或以其他随机方式启动行为。

[请注意,在同一表达式中将++与其他运算符混合使用是不好的做法。众所周知,++运算符很危险,因为它们引入了写入的副作用,并且这种副作用可能无法与表达式的其余部分配合。

另一答案

伦丁有一个很好的,彻底的答案。我希望这不是题外话...

最后一条语句恰好是将指针递增为整数。如果将打印语句更改为此,您可以看到p如何递增。

    printf("%d, %p\n",x,p);

使用gcc,我得到以下输出:

6,0x7ffeee3a92a4
6,0x7ffeee3a92a8
-298151255,0x7ffeee3a92a9

在这里,您可以看到指针的前两行已递增sizeof(int)(4字节)。但是,未定义的行为发生在最后一条语句中,在我的情况下,该语句打印出垃圾,因为它不再与4B对齐。在这种情况下,碰巧现在将指针视为一个int(因为它现在将值加1)。

以上是关于++ * p和* p ++之间的差异的主要内容,如果未能解决你的问题,请参考以下文章

fold change(差异倍数), P-value(差异的显著性)

ARIMA 的 R 和 Stata 之间的主要差异

CSS3选择器:nth-child和:nth-of-type之间的差异的那些事儿

CSS3选择器:nth-child和:nth-of-type之间的差异——张鑫旭

查找树中两个节点之间的深度差异,而无需一直到根

scanf和cin的差异