[C语言]关于printf输出的奇怪事

题目

打开这篇文章,屏幕前的你一定也是C语言大军中的一员,不知道你能否猜出下面四个程序的运行结果
1.

#include<stdio.h>
int main(){
   char s[]="123",*p;
   p=s;
   printf("%c%c%cn",*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%dn",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%dn",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("%un",p);
   //我们打印p向后移动之前和向后移动完毕后的地址进行比较  
   printf("%u n%c%c%cn%un", p,*p++,*p++,*p++,p);
  return 0;
}

首先我们要明确我们要讨论的内容
一:
printf("%u n%c%c%cn%un", p,*p++,*p++,*p++,p);
如果上面语句的第一个%u与printf("%un",p);打印结果相同,则一定是 数值存储于栈,数值不会变化
二:
printf("%u n%c%c%cn%un", p,*p++,*p++,*p++,p);
如果上面语句的第一个%u与printf("%un",p);打印结果不同,且于后一个相同 则一定是 变量且表达式的结果采用临时变量存储于栈,变量会发生变化

那么揭晓答案:
在这里插入图片描述
正是第二种情况

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>