gpt4 book ai didi

c - 指针、后增量运算符和序列点

转载 作者:太空宇宙 更新时间:2023-11-04 00:16:08 24 4
gpt4 key购买 nike

当我运行这个玩具程序时,

#include<stdio.h>

int main(void)
{
int arr[] = {11, 22, 33};
int *ptr = arr;
printf("ptr at: %p\n", (void *)ptr);
printf("Result of expression: %d\n", *ptr++); // line 8
printf("ptr at: %p\n", (void *)ptr);
}

我得到的输出是:

ptr at: 0x7fffffffdbf0
Result of expression: 11
ptr at: 0x7fffffffdbf4

我对 第 8 行 发生的事情的理解是,根据优先级规则(post increment ++ 的优先级高于取消引用 *) 表达式 *ptr++ 等同于 *(ptr++)Here是我经历过的一个很好的解释。但是,在那个解释中没有提到序列点。

在混合中加入序列点,我假设打印了 11,因为 ptr 仅在序列点之后递增(恰好是之后 printf 的所有参数都被评估)达到了。而且,后增量运算符实际上在序列点之后完成它的工作(增加和写入)。我的理解正确吗?

最佳答案

I assume that 11 is printed because ptr is incremented only after the sequence point (which happens to be after all the arguments to printf are evaluated)

没有。这与序列点无关。后递增表达式递增其参数,但表达式的值是递增之前的参数值。

对于 int* 来说,post increment 看起来很像这个函数:

int* postInc(int** p)
{
int* tmp = *p;
*p = *p + 1;
return tmp;
}

*p++ 看起来像这样:

*postInc(&p);

关于c - 指针、后增量运算符和序列点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45612102/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com