文章目录
前言
记录暑假期间自学C语言的小问题和总结
一、创建C语言项目
这里使用的是Visual Studio 2019
首先新建一个C++空项目
然后在项目方案资源管理器中新建一个源文件
因为我们新建的是C语言但是创建项目中是C++的模板
所以需要将新建源文件后缀改为.C即可
如图所示:
最后按照C语言的正常格式进行书写头部文件和主函数
如图:
二、printf函数介绍
C语言本身不提供输入输出语句,输入输出操作是由C标准函数库中的函数来实现的
scanf函数和printf函数
printf函数的一般格式:
printf(格式控制,输出序列)
例如:
printf("%d,%c\n",i,c)
“格式控制” 称为格式控制字符串,简称格式字符串。它包括两个信息:
- 格式声明:由%和格式字符组成,如%d、%f等。其作用是将输出的数据转换成指定的格式输出。格式声明总是由%字符开始
- 普通字符:即需要在输出时原样输出的字符 如上面printf函数中双引号内的逗号、空格和换行符等等。
输出序列:程序需要输出的一些数据,可以是常量、变量或表达式。
接下来介绍格式字符
1.%d
用来输出一个有符号的十进制整数
可以在格式声明中指定输出数据的域宽
如用“%5d”,指定输出数据占5列,输出的数据显示在此5列数据的右侧
域宽 其官方说法就是所占的列数
下面来举个例子可能会方便理解一些:
输入下面语句:
printf( "%5d\n%5d\n",12,-345 );
效果:
12(12前面有3个空格)
-345(-345前面有1个空格)
关于域宽如果说还是不太理解可以参考一下这位老哥的博客https://blog.csdn.net/bufanq/article/details/51148891
若输出 long(长整型)数据,在格式符d前加字母l(代表long),即%ld。
若输出 long long(双长整型)数据 ,在格式符d前加两个字母ll(代表 long long) 即%lld
2.%c
用来输出一个字符
例如:
char ch = 'a';
printf( "%c\n", ch );
效果:
3.%s
用来输出一个字符串
例如:
printf( "%s\n", "Chinese" );
效果:
4.%f
用来输出实数(包括单、双精度、长双精度),以小数形式输出
有几种用法:
1.基本型 用%f
不指定输出数据的长度,由系统根据数据的实际情况决定数据所占的列数。
一般系统处理的方法:
实数中的整数部分全部输出,小数部分输出6位。
例如:
#include<stdio.h>
int main( ) {
double a = 1.0;
printf( "%f\n",a/3 );
return 0;
}
运行结果:
虽然a是双精度型,a/3的结果也是双精度型,但是用%f格式声明只能输出6位小数
2.指定数据宽度和小数位数 用%m.nf
例如:
#include<stdio.h>
int main( ) {
double a = 1.0;
printf( "%20.15f\n",a/3 );
return 0;
}
指定了数据宽度20位和小数位数15位
运行结果:
这里小数点和0各算一位
注意0前面还有3个空格
所以最后是20位
应该注意:
一个双精度数只能保证15位有效数字的精确度,即使指定小数位数位50(如用%55.50f),也不能保证输出的50位都是有效数字。
效果:
可以看到从第15位开始数字就不再准确了
同理
float型数据的存储只能保证6位的有效数字 double型数据只能保证15位的有效数字 根据实际运算可能会有1位的偏差 ,计算机输出的数字不都是绝对精确的。
例如:
#include<stdio.h>
int main( ) {
float a;
a = 10000 / 3.0;
printf( "%f\n", a );
return 0;
}
效果:
本来计算的理论值应为333.33333***,但是由于float型数据只能保证6-7位有效数字,虽然程序输出了6位小数,但从左面第7位数字(即第3位小数)以后的数字并不保证绝对正确。
3. 输出的数据向左对齐 用%-m.nf
在m.n前加一个负号,其作用与%m.nf形式作用基本相同,担当数据长度不超过m时,数据向左靠,右端补空格。
如:
#include<stdio.h>
int main( ) {
float a;
a = 10000 / 3.0;
printf( "%-25.15f,%25.15f\n", a, a );
return 0;
}
运行效果:
第一次输出a时输出结果向左端靠,右端空5列。
第二次输出a时输出结果向右端靠,左端空5列。
5.%e
指定以指数形式输出实数
如果不指定输出数据所占的宽度和数字部分和小数位数 编译系统会自动给出数字部分的小数位数为6位,指数部分占5列
数值按照标准化指数形式输出(即小数点前必须有且只有一位非零数字)
例如:
#include<stdio.h>
int main( ) {
printf( "%e\n", 123.456 );
return 0;
}
运行结果:
小数点后面 字母e的前面占6列 e以及往后占5列
其中e也可以写成大写E形式,不过输出的时候也会输出大写的E
6.其他格式符
- %i 作用与%d格式符相同 按十进制整型数据的实际长度输出 一般习惯用%d而不用%i
- %o 以八进制整数形式输出。将内存单元中的各位的值(0或1)按八进制形式输出,因此输出的数值不带符号,即将符号位也一起作为八进制整数的一部分输出。
例如:
#include<stdio.h>
int main( ) {
int a = -1;
printf( "%d\t%o\n", a, a );
return 0;
}
运行结果:
-1在内存单元中的存放形式(以补码形式存放在4个字节)如下:
11111111 | 11111111 | 11111111 | 11111111 |
用%d输出a时,得到-1,按%o输出时,按内存单元中实际的二进制数按3位一组构成八进制形式如上面的32个二进制数可以从右至左每3位为一组:
11,111,111,111,111,111,111,111,111,111,111
对应的十进制数就是3 7 7 7 7 7 7 7 7 7 7
即最终输出数
如果说对而原码、补码等和二进制、八进制等相关的知识还不太了解,可以查阅数据结构和计算机组成原理等书
- %x 以十六进制行书输出整数
- %u 用来输出无符号型数据 以十进制整数形式输出
- %g 用来输出浮点数 系统自动选f格式或e格式输出 选择里面长度较短的格式 不输出无意义的0
总结
本文前半部分介绍了C的运行环境和新建项目方法
后半段较为详细的介绍了在C语言中printf函数中的各个格式字符作用,往后会对其他函数进行总结