printf函数是一个标准库函数,它的函数原型在头文件“stdio.h”中。
-
函数原型:
_CRTIMP int_cdecl printf(const char*.…);
-
const char
是printf函数的第一个参数,显然是指向“只读”字符的字符指针; -
…….
表示不定长参数,即函数的参数个数是不确定的; -
%
表示的是格式化字符,其余为非格式化字符。
-
-
标志字符
字符 含义 - 左对齐 //通过对齐和宽度限制,可以形成规则输出 + 输出符号(+/-) 空格 输出值为正时冠以空格,为负时冠以负号 # 对c,s,d,u类无影啊;对o类,在输出时加前缀0;
对x类,在输出时加前缀0x;对e,g,f类,当结果有小数时才给出小数点。 -
输出最小宽度
用十进制整数来表示输出的最少位数(包括正负号、小数点);
若实际位数多于定义的宽度,则按实际位数输出;
若实际位数少于定义的宽度,则补以空格。形式如:"%5d%10f%15e"。
-
长度
长度格式符为h、l两种;
h表示按短整型量输出,l表示按长整型量输出,
-
l在e、f、g前,指定输出精度为double。
形如:
"%hd,%ho,%hx,%hu,%hi,%ld,%lo,%lx,%lu,%li,%lf,%le,%lg\n"
。
高阶篇
-
输出列表求值顺序
- 不同的编译系统不一定相同,可以从左到右,也可从右到左。(C语言未定义)
* VC++6.0、Win-TC都是按从右到左进行的,但从运行实践来看,两个运行环境的运行机理是不尽相同的。
从运行结果来看(前面VC6后面Win-TC),
1.Win-TC是按从右到左逐个进行运算的(i++/i--在每个逗号后即会更新结果);
2.VC++6.0中虽也是从右到左顺序求值的,但:若是“i++”或“i-”则值是当前i值,
若为“++i”或“--i”则printf每项得到值后,对i后续一并做i=i+1或i=i-1.
* Format_Specification——不安全输出
- 输出参数小于需求参数(%),则后续从栈上取脏数据;
- 输出参数大于需求参数(%),则取前面参数后丢失;
- VS中使用
printf_s
来规避这种不安全输出; - C++使用stream式输入输出,来规避不安全的 printf;