正常输出

  1. printf("hello world!");

带常量和变量

  1. printf("hello %d",26);
  1. int age = 26;
  2. printf("hello %d",age);

格式符%d表示以有符号的十进制形式输出一个整型,格式符参数中的26和age会代替%d的位置。

为什么需要格式符

printf("hello %d",age); printf 中的第二个参数,本质上是一串二进制代码,而格式符就是决定这些二进制以什么格式输出。printf("%d\n",'a'); ‘a’ 对应的ascll码再对应补码,之后输出补码的十进制。

单纯的二进制数据是没有任何意义的,既可以表示指令也可以表示数据,任何数据都是二进制代码,所以我们就需要规定以哪种方式去解读二进制代码,这就是格式符存在的原因。

格式符

image.png

输出宽度

  1. printf("The price is %4d", 14);
  1. The price is 14

%4d的意思是输出宽度为4,而”14”的宽度为2,因此多出2个宽度,多出的宽度就会在左边用空格填补,因此你会看到”14”左边多了2个空格。
如果实际数值宽度比较大,比如用%4d输出宽度为6的”142434”,那就会按照实际数值宽度6来输出。

%-4d表示输出宽度为4,如果比实际数值宽度大,多出的宽度会在右边用空格填补;如果4比实际数值宽度小,就按照实际数值的宽度来输出。

浮点数的小数位数

如果只想输出2位小数,把%f换成%.2f即可printf("My height is %.2f",179.95f);

缓冲区

printf 何时将输出送到屏幕上?它会把输出发送到缓冲区的中间存储位置。然后缓冲区不断地发送到屏幕上,当缓存区满、遇到换行符号或需要输入的时候,会刷新缓冲区。

参数传递原理

  1. float n1;
  2. double n2;
  3. long n3,n4;
  4. printf("%ld %ld %ld %ld\n", n1,n2,n3,n4);

该调用告诉计算机把变量n1、n2、n3和n4的值传递给程序。这是一种常见的参数传递方式。程序把传入的值放入被称为栈(stack)的内存区域。计算机根据变量类型(不是根据转换说明)把这些值放入栈中。因此,n1被储存在栈中,占8字节(float 类型被转换成double类型)。同样,n2 也在栈中占 8字节,而n3和n4在栈中分别占4字节。然后,控制转到printf()函数。 该函数根据转换说明(不 是根据变量类型)从栈中读取值。%ld 转换说明表明printf()应该读取4字节,所以printf()读取 栈中的前4字节作为第1个值。这是n1的前半部分,将被解释成一个long 类型的整数。根据下一个%ld转换说明,printf()再读取4字节,这是n1的后半部分,将被解释成第2个long类型的整数
。类似地,根据第3个和第4个%ld, printf()读取n2的前半部分和后半部分,并解释成两个long类型的整数。因此,对于n3和n4,虽然用对了转换说明,但printf()还是读错了字节。

  • 比起类型转换这种截断更生硬
  • 用 %c 打印 336 时(00000001 01010000)只会打印 01010000,二进制的顺序就是从右往左,压入栈的时候也是先压右边的。