题目
打开这篇文章,屏幕前的你一定也是C语言大军中的一员,不知道你能否猜出下面四个程序的运行结果
1.
#include<stdio.h>
int main(){
char s[]="123",*p;
p=s;
printf("%c%c%c\n",*p++,*p++,*p++);
return 0;
}
#include<stdio.h>
int main(){
char s[]="123",*p;
p=s;
printf("%c",*p++);
printf("%c",*p++);
printf("%c",*p++);
return 0;
}
#include<stdio.h>
int main(){
int a=0;
printf("%d%d%d\n",a++,a++,a++);
return 0;
}
#include<stdio.h>
int main(){
int a=0;
printf("%d",a++);
printf("%d",a++);
printf("%d",a++);
return 0;
}
上面程序运行结果如下
- 321
- 123
- 210
- 012
不知道屏幕前的你做对几道题呢?
如果全对了的话,那你
你可能对本片所讲的知识已经很熟悉了,可以选择不在看下去;
如果觉得文章有趣,想一探究竟,欢迎继续读下去
看到这里的同学可能作对了2和4,但是1和3有一些不太理解,为什么会这样呢?
解释
下面就为大家解惑,(2和4为正常情况,这里不在赘述)
首先,请大家观察一下1和3的共同点
最主要的是输出多个内容 %c%c%c 和%d%d%d
在输出这多个数据的时候,printf 的内部情况是怎么样的呢?
是从左到有依次进行输出吗? 从结果,我们可以发现,显然不是这种情况.
printf是一个函数,包含在stdio.h库当中,既然是函数,那么传递给它的函数既然而然在存放在栈当中的
可能有的小伙伴会很疑惑,什么是栈呢?
栈可以理解为一个容器,很想存放羽毛球的桶,我们先放入球桶当中的球一定是最后才能拿出来的,就像下面的过程,1我们最先放进去,最后取出来
了解了上面的过程,我们再来看一下这道题目:
#include<stdio.h>
int main(){
int a=0;
printf("%d%d%d\n",a++,a++,a++);
//由于是三个运算表达式,我们采用一个变量替换掉表达式,于是有
//a1=a++;
//a2=a++;
//a3=a++;
//因为是从左到右放入栈当中的,计算肯定也会是从左到右
//我们来计算一下a1,a2,a3的值
//由于是后置++ ,会先赋值在进行++,因此会得到下面的结果
//a1=0;a2=1;a3=2
return 0;
}
听到这里,不知道你
如果你觉得不错,欢迎点赞+收藏,感谢!
延申
上边我们采用临时变量入栈的方式来分析题目,现在我们来验证一下这种方式的正确性
看程序:
#include<stdio.h>
int main(){
char s[]="123",*p;
p=s;
//我们以十六进制打印一开始的p的地址
printf("%u\n",p);
//我们打印p向后移动之前和向后移动完毕后的地址进行比较
printf("%u \n%c%c%c\n%u\n", p,*p++,*p++,*p++,p);
return 0;
}
首先我们要明确我们要讨论的内容
一:
printf("%u \n%c%c%c\n%u\n", p,*p++,*p++,*p++,p);
如果上面语句的第一个%u与printf("%u\n",p);打印结果相同,则一定是 数值存储于栈,数值不会变化
二:
printf("%u \n%c%c%c\n%u\n", p,*p++,*p++,*p++,p);
如果上面语句的第一个%u与printf("%u\n",p);打印结果不同,且于后一个相同 则一定是 变量且表达式的结果采用临时变量存储于栈,变量会发生变化
那么揭晓答案:
正是第二种情况