前言
以下均使用Visual Stdio 2022集成开发环境,内容仅适用于初学者。本章内容为零散知识点,目的是为了让读者更加深入理解某一方面的知识。
目录
一、printf函数的输出形式
Ⅰ、printf函数输出格式
Ⅱ、printf 函数的右结合性
Ⅲ、printf函数中自增自减的复合运算
二、格式字符
Ⅲ、转义字符
一、printf函数的输出形式
Ⅰ、printf函数输出格式
printf函数是一个标准库函数,它的函数原型在头文件“stdio.h”中。当我们需要使用时需要引入stdio.h头文件。printf函数的一般调用形式如下:
printf(“格式控制字符串”, 输出表列);
如下
#includeint main() { int a = 1; int b = 2; printf("a的值为%d b的值为%dn", a, b); printf("a+b的值为%dn", a + b); printf("%dn", 23); printf("%d %d %d", a, b, a + b); return 0; }
结果为
①n为转义字符,详见目录->转义字符。
②%d为格式字符,详见目录->格式字符。
③双引号内容为打印内容。格式字符,格式字符对应输出列表的变量(按顺序一一对应),%d为十进制整数输出。转义字符,转义字符n意思是打印到n这个位置时光标移动到下一行。
④输出列表中的数据可以为变量、常量、表达式。
Ⅱ、printf 函数的右结合性
右结合性就是输出列表的运行顺序,如下
#includeint main() { int a = 10; int b = 0; //等号表达式的值为左边的值 printf("%d %d ", b = a + 10, a = b + 1); return 0; //即b = a + 10 可以用a+10代替 } //只不过在列表中b的值已经被改变
结果为
当printf中参数列表是从左边向右边运行时,输出应该为 20 21
当printf中参数列表是从右边向左边运行时,输出应该为 11 1
所以printf函数具有右结合性。
Ⅲ、printf函数中自增自减的复合运算(可略过)
那么有争议的问题来了!
#includeint main() { int a = 10; printf("%d %d %d %d %d %d", a++, a, --a, a--, a++, ++a); return 0; //⑥ ⑤ ④ ③ ② ① }
结果为
自增自减运算符加入到printf函数中就变得不一样了,由于程序从右向左运行,运行流程如下。
①前置++,首先a的值先+1 ,此时a = 11并留置(不作为格式字符真实值)在此。(留置产生,所以11作为真实值并打印。)
②后置++,运行程序前a的值为11,然后将11作为格式字符的真实值,运行之后a = 12。(打印11。)
③后置--,运行程序前a = 12 ,然后将12作为格式字符的真实值,运行后a = 11。(打印12。)
④前置--,运行程序前 a = 11,然后自减 a = 10,并留置在此。(留置产生,所以11作为真实值并打印。)
⑤无任何操作,a = 10留置在此。(留置产生,所以11作为真实值并打印。)
⑥后置++,运行程序前a = 10,然后将a作为真实值打印。a自增 a = 11。(打印10。)
输出列表扫描完毕,a最终的结果为11,最后将11作为以上操作留置后的真实值。
总结:在printf函数中遇见自增自减运算符时,只需要知道后置++和后置--不需要留置,其他的都需要将a的结果算出来,然后再填充到留置的区域。
注:以上结果在Visual Studio 2022实验的结果,因为涉及到自增自减的复合运算,不同的编译器给出的解决方案不同,所以得出的结果不同,以上我们只需要知道printf函数具有右结合性就行了,类似于这种自增自减的复合运算的代码,正经的程序员根本就不会写这种垃圾代码,因为不具有普遍性,当然在朋友面前装一下还是可以的(。ӧ◡ӧ。)。
二、格式字符
| 格式字符 | 含义 |
|---|---|
| %d | 以十进制整数形式输出 |
| %ld | 以十进制长整形输出 |
| %f | 以单精度浮点型输出 |
| %lf | 以双精度浮点型输出 |
| %o | 以八进制整型输出整数。 |
| %x或%X | 以十六进制形式输出整数 |
| %u | 以十进制无符号整形输出 |
| %i | 以十进制整形输出(与%d无异) |
| %c | 输出单个字符 |
| %s | 输出字符串 |
| %e或%E | 以指数形式输出 |
| %g或%G | 自适应数据输出(数据够大或够小 则以指数形式输出,否则以小数 形式输出 |
| %p | 输出地址 |
① 对于%f与%lf如下,当违背以下准则时可能会导致程序出错或崩溃。
| 类型 | scanf函数 | printf函数 |
|---|---|---|
| float | %f | %f、%lf |
| double | %lf | %lf |
②格式字符的标志(在英文格式字符前加字符表示不同的意思)
| 标志 | 含义 | 实例 |
|---|---|---|
| n.m | n表示整数占几行,m表示小数占几行 | %2.3f |
| - | 输出的结果左对齐 | %-d |
| 空格 | 输出值为正时冠以空格,为负时冠以负号 | |
| # | 输出带有前导的数据(八进制为0~~~, 十六进制为X~~~,~表示数字) | %#d |
Ⅲ、转义字符
| 转义字符 | 释义 |
|---|---|
| ? | 在书写连续多个问好时使用,防止他们被解析成三字字词 |
| ' | 用于表示字符常量 |
| " | 用于表示一个自负床内部的双引号 |
| \ | 用于表示一个反斜杠,防止它被解释为一个转义序列符 |
| a | 警告字符,蜂鸣 |
| b | 退格符 |
| f | 换页符 |
| n | 换行符 |
| r | 回车 |
| t | 水平制表符(8个空格) |
| v | 垂直制表符 |
| ddd | ddd表示1-3个八进制的数字。如:120 |
| xdd | dd表示2个十六进制数字,如:x30 |
知识点:
在Windows系统中我们输入回车时,输入的字符是rn,unix系统中回车为n,而mac系统中回车的字符为r.



