递归就是先进后出的,与printf无关。
fun() 里面有调用它自身,一层一层调用,最里层先返回。
这个例子是用printf来输出一个数。放前面与放后面会有正向与反向的区别,是因为:
放前面,先输出,再递归调用,递归里面也是先输出再递归调用,所以是前向;
放后面,先递归调用,再输出,也就是,只要递归条件满足,会一直递归调用,直到最后一次递归条件不满足,开出输出,然后一次递归结束,回到上一次递归,也是输出,再返回,再输出,直到第一次递归调用返回,最后一次输出,所以是反向。
看输出是在调用递归函数之前还是之后即可,分别在之前之后调用输出结果不同
#include <stdio.h>
void print_num(int n)
{
if(n == 0)
{
return;
}
//先输出,输出987654321
printf("%d", n);
print_num(n - 1);
//后输出,输出123456789
//printf("%d", n);
}
int main()
{
int n = 9;
print_num(n);
return 0;
}
修饰符列表 | 含义 |
---|---|
数字 | 表示最小字段宽度(默认为打印在字段右端),如若该字段宽度不能容纳待打印的项,那么系统会按照待打印项的宽度打印 |
.数字 | 对于浮点数来说表示小数点后应该保留几位小数(会四舍五入)(一些编译器默认打印为保留小数点后六位小数);对于整数来说表示打印的最小位数,如果待打印的整数不够最小位数会在前面补0至达到最小位数;对于字符串来说表示打印的字符个数 |
l | 可以与%f,%d,%u等结合使用,如%lf(表示double类型的值),%ld(表示long int类型的值),%lu(表示unsigned long int类型的值) |
L | 可以与%f,%e等结合使用,如%Lf,%Le(表示long double类型的值) |
*号 | 算一个占位符,可用于指定字段宽度和精确位数,且需要有对应的项与之匹配 |
标记 | 本文只介绍 (-,+,空格,#)(具体见后文) |
例代码如下:
#include<stdio.h>
int main()
{
printf("/%s/\n", "hello world");
printf("/%.4s/\n", "hello world");
printf("/%10.4s/\n", "hello world");
printf("/%d/\n", 10);
printf("/%10d/\n", 10);
printf("/%.5d/\n", 10);
printf("/%10.5d/\n", 10);
printf("/%f/\n", 3.14);
printf("/%.2f/\n", 3.14);
printf("/%10f/\n", 3.14);
printf("/%10.2f/\n", 3.14);
printf("/%*.2f/\n", 10, 3.14);
printf("/%10.*f/\n", 2, 3.14);
printf("/%*.*f/\n", 10, 2, 3.14);
printf("/%*.*f/\n", 8, 4, 3.14);
return 0;
}
结果如下:
标记 | 含义 |
---|---|
-号 | 从字段的左侧开始打印该项 |
+号 | 待打印的值若为有符号值,且若为正值,则在值前补充加号,若值为负值,则在值前补充减号 |
空格 | 待打印的值若为有符号值,且若为正值,则在值前补充空格,若值为负值,则在值前补充减号 |
#号 | 如果作用于%o,则打印结果在值前显示0,如果作用于%x,则打印结果在值前显示0x |
例代码如下:
#include<stdio.h>
int main()
{
printf("/%5d/\n", 10);
printf("/%-5d/\n", 10);
printf("/%+5d/\n", 10);
printf("/%+5d/\n", -10);
printf("/% 5d/\n", 10);
printf("/% 5d/\n", -10);
printf("%o\n", 10);
printf("%#o\n", 10);
printf("%x\n", 10);
printf("%#x\n", 10);
return 0;
}
结果如下:
注:标记也可灵活的组合运用,如“%+#7.2f”,本文不做过多演示,读者可自行尝试