在这里打印输出++*p的值应该是多少?

#include <stdio.h>

int main(void)

{

int a=3,*p=&a;

printf("++*p=%d,(*p)++=%d",++*p,(*p)++);

return 0;

}

图片描述

我觉得执行结果应该是++p=4,(p)++=3
因为先取p 再自加 再打印输出,请问为什么输出结果是++p=5

回答:

不知道题主使用的是哪个编译器。但是如果楼主使用的是 vc6 的话,可能就没有这个问题了。因为用 vc6 来编译执行这段代码,输出的结果和题主的预期是一致的:++*p=4,(*p)++=3。如下图:

vc6结果

如果楼主使用是其它编译器得到的结果 可能就不一样了,比如在此我用 gcc 编译运行的结果为: ++*p=5,(*p)++=3 。 如下图:

gcc

之所以出现这个差异不是编译器的问题,而是函数的参数求值顺序在 c 语言标准中是 未定义 的。所谓 未定义 就是:标准并没有规定编译器一定要以某种特定的顺序来对函数参数进行求值。所以导致了此类代码在不同的编译器上可能有不同的表现(上面的两张图片就是证明)。实际开发应该避免写类似的代码。

建议题主不要在这个问题上花费太多时间,感觉意义不大,因为这个问题本身就没有正确答案,强行解释某个答案除了会让自己更加苦恼外真的没有其他好处了。这里只要记住这种行为是未定义就行了。 把宝贵的时间用在更有意义的事情上吧。

参考:
c / c++ 函数参数求值顺序 ?
function parameter evaluation order
Why are these constructs (using ++) undefined behavior?

回答:

因为printf()中的参数是从右到左求值的。先执行(*p)++变成4,然后执行++*p变成5

实际写代码,千万不要把多种运算符混在一起,也不要在printf中写有副作用的语句。

以上是 在这里打印输出++*p的值应该是多少? 的全部内容, 来源链接: utcz.com/p/195222.html

回到顶部