1. Die Parameter der prinf-Funktion enthalten Zeigerausdrücke. In welcher Reihenfolge werden sie offensichtlich nicht von links nach rechts berechnet?
#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;
}
在一条语句里多次改变一个变量属于未定义行为,在不同平台可能有不同结果。这个问题没有意义。
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)