printf解析方式

来源:互联网 发布:c语言里的共用体怎么用 编辑:程序博客网 时间:2024/06/15 05:32

先看一段代码:

void main(void){    int arr[]={6,7,8,9,10};    int *ptr=arr;    *(ptr++)+=123;    printf("%d,%d",*ptr,*(++ptr));}

程序运行最终输出的结果是8,8

其实刚开始我也很纳闷,*ptr不是arr[1] = 7吗?怎么回事呢

我认为一个很关键的问题是:可能有很多人把*(ptr++)+=123;展开的时候变成了*(ptr++)= *(ptr++) + 123;,这样的话得到的结果就是9,9,这是个明显的错误。因为*(ptr++)+=123;*(ptr)+=123;ptr++;两句话的组合。若要展开,即为*(ptr)= *(ptr)+123;ptr++;,而不是想当然将ptr++;这句话执行两次。

还有一个点,非常重要,当我们即使按照上面提到的方式来展开的时候,发现任然有问题,难道不是应该得到7,8这样的结果吗?

这是我们可能就会想为什么会这样,于是我做了一个小测试:

printf("%d,%d",*(++ptr),*(ptr));

将上面两个结果放过来打印,意外的是结果竟然是8,7

可能大家已经发现问题所在,这也就是今天要说的,printf在有多个参数时,其解析方式是从后面开始的,所以也就有了今天这篇文章。