基本数据类型

基本数据类型是C语言提供的不可再分割的数据类型,有以下几类:

  • int 整型,表示整数
  • char字符型,表示单个字符,占1字节,可当作1字节整型来使用
  • float单精度浮点型
  • double双精度浮点型

在基本数据类型之上,C语言还提供了限定符,用于修饰基本数据类型,限制符包含以下分类:

  • 符号限定符,包括signedunsigned,表示有符号和无符号
  • 长度限定符,包括short, longlong long,用于修饰整数,表示短整数型,长整型和超长整型。long也可以修饰double,但这并不常用。


int与char统称为整型,都可以用于表示整数,区别是char只占1字节,而int一般占4字节。这里注意一点,C语言标准只规定了char占用一个字节,而未规定int占几个字节,具体的字节数由编译器与机器架构实现,比如在32位的机器上,int占4字节,但是在8位单片机上,int可能只占2字节。

char除了可以表示1字节的整数外,还可以表示单个字符,C语言中,字符用单引号表示,如'a','#'。字符的实际存储形式是字符对应的ASCII值,如'a'的ASCII值是97,那么,在程序中,所有出现'a'的地方都可以用数值97代替。

在int与char类型的前面可以加上signed或unsigned限定数据的符号,表示数据的正负。signed与unsigned的区别在于数据的最高位,signed数据的最高位用0表示数据为正,用1表示数据为负,剩下的位数用于表示数据的数值大小,而unsigned数据则全部位都用于表示数值大小。所以,相同类型的数据,unsigned比signed所表示的数据范围要大。以char型数据为例,signed char表示的范围为 -128-127,unsigned char表示的范围为0-255。

short与long可以用于修饰int,用于获取不同长度的整型。在32位的Ubuntu14.04系统中,int占用4字节,而short占用2字节,long int占用4字节,long long int占用8字节。这里同样要注意,C语言标准并未规定short与long的具体长度,标准只规定了short的长度不能大于int,long的长度不能小于int,具体的长度还是由编译器与机器架构实现。

signed/unsigned可以和short/long一起使用,比如unsigned short表示无符号短整型。

float与double统称实型,它们都可以用于表示浮点数。浮点数都是有符号数,不可以用符号限定符进行修饰,像unsigned short float这样的写法是错误的。在32位的Ubuntu14.04系统中,float占用4字节,double占用8字节。长度不一样导致两者所能表示的数据范围和精度不一样,float型数据能得到6位有效数字,而double型数据能得到15位有效数字。此外,long可与double构成long double类型,表示高精度浮点型,经验证,long double类型的长度可以达到16字节!

格式化输入输出函数

C语言标准库提供了两个用于从进行输入输出的函数printf和scanf。printf可以向标准输出(一般是屏幕终端)按指定格式输出内容。scanf可以从标准输入(一般是键盘)按指定格式接收数据。

printf

函数原型:

int printf(格式化控制字符串, 输出参数1, 输出参数2, ...);

返回值:

成功返回打印的字符个数,失败返回一个负数。

格式控制字符

使用printf、scanf的关键是格式控制字符,可以通过不同的格式控制字符来控制数据的输入输出,采用不同的格式控制字符,即使相同的数据,也可以有不同的输入输出形式,参考下表:

格式控制字符描述
%c单个字符
%d有符号的十进制整数
%u无符号的十进制整数
%x无符号十六进制整数,使用0~f
%X无符号十六进制整数,使用0~F
%o无符号八进制整数
%f十进制浮点数
%e浮点数的指数形式,比如 1.23e+001
%E浮点数的指数形式,比如 1.23E+001
%s字符串

长度与对齐控制

可以在格式控制字符中指定长度与对齐方式,一般用于整数的输入输出。

长度与对齐方式的设置形式是%x.y,其中x用于限定输出长度,在该长度以内,默认按照右对齐,可以前面加上“-”表示左对齐,超出该长度时,该参数无效。y用于限定浮点数的打印精度,默认是小数点后6位。

举例说明:

printf("%6d\n",123); //输出长度6位,右对齐
printf("%6d\n",1234);
printf("%6d\n",12345);
printf("%6d\n",123456);
printf("%6d\n",1234567);

printf("%-6d\n",123); //输出长度6位,左对齐
printf("%-6d\n",1234);
printf("%-6d\n",12345);
printf("%-6d\n",123456);
printf("%-6d\n",1234567);

效果:

   123
  1234
 12345
123456
1234567
123
1234
12345
123456
1234567


浮点数:

printf("%f\n", 3.1415926);   //默认格式输出,小数点后6位
printf("%.3f\n", 3.1415926); //小数点后保留3位
printf("%.4f\n", 3.1415926); //小数点后保留4位
printf("%.5f\n", 3.1415926); //小数点后保留5位
printf("%6.2f\n", 3.1415);   //小数点后保留两位,宽度为6字节,右对齐
printf("%7.2f\n", 3.1415);   //小数点后保留两位,宽度为7字节,右对齐

效果:

3.141593
3.142
3.1416
3.14159
  3.14
   3.14

类型限定符

对于使用unsigned或long修饰的类型,打印时还需要加上对应的类型限定符,否则打印的结果也是不对的,规则列表如下 :

数据类型格式控制字符
char/short/int%d
long int

%ld

long long int%lld
unsigned char/short/int%u
unsigned long int%lu
unsigned long long int%llu
float/double%f或%lf
long double%Lf

scanf

函数原型:

int scanf(格式控制字符串, 输入参数1, 输入参数2, ...);

返回值:

成功返回读取的参数个数,失败返回EOF。


示例:

#include<stdio.h>
int main(void) 
{ 
    int a,b,c; 
 
    printf("请输入三个数字:");
    scanf("%d%d%d",&a,&b,&c); 
    printf("%d,%d,%d\n",a,b,c);
}

关于使用scanf有以下注意点:

  1. 格式控制字符用于说明输入数据的类型,与printf的控制格式字符遵循一样的对应关系。
  2. 输入参数是地址
  3. 格式控制字符串中的非占位符也要按原样进行输入,比如“%d,%d”,那么在输入的时候,两个数之间要以逗号间隔。
  4. 在输入数据时,如输入空间、回车、tab键或者遇到非法字符时,则认为输入数据结束。
  5. scanf函数返回成功输入的数据个数。

另外,scanf还支持在格式控制字符串中加入正则表达式,这算是scanf的高级用法,参考:sscanf 和正则表达式 | 不积小流,无以成江海

转义字符

用于表示无法输入的字符或不可见的字符,比如换行符,制表符,也用于表示一些在C语言中有特殊作用的字符,比如单引号和双引号。

形式:“\”后面跟一个字符或数字。


  • 无标签