在上一篇博客中我们详细介绍了C语言中的基础数据类型和相关转换说明的原理剖析,那么这一篇博客对数据类型的具体使用作简单介绍和总结。

使用数据类型

我们在编写程序的时候,应当注意合理选择所需的变量及其类型,通常来说,使用int或者float类型来选择数字,char类型表示字符。

Tip:使用变量之前必须先声明,且选择有意义的变量名,若是需要初始化变量,应当与类型匹配。

声明(初始化)方式:

1
2
int apple = 3/*正确*/
int bananas = 4.0; /*不好的方式*/

若是我们使用一个类型的数值初始化给不同类型的变量的时候,编译器会首先把值转换成与变量匹配的类型,会导致数据错误以及丢失。

例如:

1
2
int cost = 12.99;	/*用double类型值初始化整型变量*/
float pi = 3.1415926536; /*用double类型的值初始化单精度浮点型*/

上述程序cost的值是12,第二个声明会损失一些精度,因为在C语言中只能保证单精度浮点型前6位的精度,一般来说编译器会对这样的初始化产生警报。

参数和陷阱

对于printf()函数的使用主要是需要注意函数中的参数,在格式化字符串中有多少个转换说明,就说明后面需要几个参数,我们需要做的就是确保转换说明数量、类型与后面参数的数量、类型是否一致。

但是这对于printf()和scanf()函数来说并不起作用,因为这两个函数的参数个数是可变的。

在下一篇博客中会对printf()和scanf()这两个函数进行具体的分析,这里就简单的做个说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
int main(void)
{
int n = 4;
int m = 5;
float f = 7.0f;
float g = 8.0f;

printf("%d\n", n, m); /*参数太多*/
printf("%d %d %d\n", n); /*参数太少*/
printf("%d %d\n", f, g); /*值的类型不匹配*/

retuen 0;
}

这是基本会出现的多数问题,在编译器中大部分也会有提醒,然而C标准对此并未作出要求,若是程序正常运行,这些细小的错误会很难察觉。

转义序列

对于转义序列来说,我们主要可以看看退格(\b)、水平制表符(\t)、回车(\r)的工作方式。

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
int main(void)
{
float salary;

printf("\aEnter your desired monthly salary:");
printf(" $_______\b\b\b\b\b\b\b");
scanf("%f", &salary);
printf("\n\t$%.2f a month is %.2f a year.", salary, salary * 12.0);
printf("\rGee!\n");

return 0;
}

这就是一个简单的薪资询问系统(简单交互),其中含有许多的转义序列。

刷新输出

printf()函数在什么时候会把输出发送到屏幕上呢?
最初,printf()会把内容发送到缓冲区的中间存储区域,然后缓冲区的内容再不断被发送到屏幕上。在C标准中规定了什么时候把缓冲区的内容发送到屏幕:

1.缓冲区满

2.遇到换行字符

3.需要输入的时候

Tip:还有一种刷新缓冲区的方法就是使用fflush()函数。

总结

C 有多种的数据类型。基本数据类型分为两大类:整数类型和浮点数类型。通过为类型分配的储存量以及是有符号还是无符号,区分不同的整数类型。最小的整数类型是char,因实现不同,可以是有符号的char或无符号的char,即unsigned char或signed char。但是,通常用char类型表示小整数时才这样显示说明。其他整数类型有short、int、long和long long类型。C规定,后面的类型不能小于前面的类型。上述都是有符号类型,但也可以使用unsigned关键字创建相应的无符号类型:unsigned short、unsigned int、unsigned long和unsigned long long。或者,在类型名前加上signed修饰符显式表明该类型是有符号类型。最后,_Bool类型是一种无符号类型,可储存0或1,分别代表false和true。

下一篇博客将对字符串和printf()、scanf()两个函数做详细解析。