C/C++语言printf函数输出指针指向的数组的值时,指针的值为什么这样变化?
1.请问prinf函数的参数中含有指针表达式,是按照什么顺序运算的,代码运算结果中显然不是从左到右进行的。
#include <stdio.h>
int main() {
int a[5] = { 1,2,3,4,5 };
int *p = a;
printf("%d\n", *p);
printf("%d %d %d %d\n", *(++p)++,*p, *p++, *p);
getchar();
return 0;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
printf{"%d",++i}
表示两个操作先执行i=i+1,再输出i
而 i++ 表示的是
先输出后,再执行 i=i+1
函数参数的运算顺序,跟函数的内部逻辑关系不大,应该是入栈前(函数执行前)先计算
++p
,函数结束后,再计算p++
。如果想知道具体的顺序,可以参照汇编代码(具体含义参考注释)题外话:
结果中出现的2和3还可以说的通。
4很奇怪,非要勉强地解释的话,
*(++p)++
括号外面的++
也对p
起作用了,但是形如
p++
运算符,应该在语句结束后才自增的,所以这样解释明显不对。我在
Cygwin + gcc (GCC) 5.4.0
环境,运行的结果如下,没有出现4。请问题主用了什么环境?如果有汇编代码的话,贴出来可以一起分析下。
在一条语句里多次改变一个变量属于未定义行为,在不同平台可能有不同结果。这个问题没有意义。
函数参数压栈的顺序是一定的,只是
参数的求值顺序是未指定
的,编译器只保证在
printf
调用之前,所有参数的值是已知的这方面的资料可以搜索
序列点(Sequence Point)