前言
以下均使用Visual Stdio 2022集成开发环境,内容仅适用于初学者。本章内容为零散知识点,目的是为了让读者更加深入理解某一方面的知识。
目录
一、printf函数的输出形式
Ⅰ、printf函数输出格式
printf函数是一个标准库函数,它的函数原型在头文件“stdio.h”中。当我们需要使用时需要引入stdio.h头文件。printf函数的一般调用形式如下:
printf(“格式控制字符串”, 输出表列);
如下
#include <stdio.h>
int main()
{
int a = 1;
int b = 2;
printf("a的值为%d b的值为%d\n", a, b);
printf("a+b的值为%d\n", a + b);
printf("%d\n", 23);
printf("%d %d %d", a, b, a + b);
return 0;
}
结果为
①\n为转义字符,详见目录->转义字符。
②%d为格式字符,详见目录->格式字符。
③双引号内容为打印内容。格式字符,格式字符对应输出列表的变量(按顺序一一对应),%d为十进制整数输出。转义字符,转义字符\n意思是打印到\n这个位置时光标移动到下一行。
④输出列表中的数据可以为变量、常量、表达式。
Ⅱ、printf 函数的右结合性
右结合性就是输出列表的运行顺序,如下
#include <stdio.h>
int 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函数中自增自减的复合运算(可略过)
那么有争议的问题来了!
#include <stdio.h>
int 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系统中我们输入回车时,输入的字符是\r\n,unix系统中回车为\n,而mac系统中回车的字符为\r.