以下代码段的输出是:
int x, y, z, w;
void p(int *y, int x) {
static int w;
*y++; x++; w = x+*--y;
printf("%d#%d#%d#%d#",x,*y,z,w);
}
int main(void) {
int x, y, z, w;
x=y=z=w=1;
do{
static int x;
p(&x, y);
printf("%d#%d#%d#%d#",x,y,z,w);
} while(0);
return 0;
}
结果为:2#0#0#2#0#1#1#1#
首先要知道,全局变量和静态变量在未初始化的情况下,编译器会根据类型自动赋值0或'\0'。
所以static int x 的值为0
然后将这个静态变量x的地址和y=1传入函数。
函数中,静态变量w同理,会等于0。
而*和++均为单目运算符,且结合方向为自右向左,并且若有b=a++,其逻辑为先赋值再++,故这里仅为取y的值但不赋给谁,再让y指针向后移一个int单位。
x自增,变为2。
而若有b=++a,其逻辑为先++再赋值,故这里为指针前移一个int单位(又回来了),其指向地址的值为0,再与x相加得2。
所以函数打印2#0#0#2#。
函数执行完后,回到main函数,x未做修改,仍为0。而yzw均为前面赋值的1,故再追加打印0#1#1#1#