C学习笔记

本文为《C Primer Plus》读书笔记。

C与数据

1、常量与变量

在程序运行中没有变化的数据类型,称为常量;在运行中可能被改变或赋值则为变量。

若数据为常量,编译器将通过用户书写的形式来识别类型(如,12为整数,12.00为浮点数)。但是变量则需要在声明时指定其类型。

2、数据类型关键字

C语言基本类型关键字:

K&R C90 C99
int signed _Bool
long void _Complex
short   _Imaginary
unsigned    
char    
float    
double    

int关键字表示基本的整数类型,longshortnsignedsigned则提供基本整数类型的变式,,如:unsigned long int 和 signed short ilnt。

char关键字指定字母与其他字符(#、$、%、*),另外,char类型也可表示较小的整数(ACSII码)

floatdoubleong double表示浮点数。

_Bool关键字表示布尔类型(false或true)。

_Complex_Imaginary分别表示复数和虚数。

3、整数与浮点数类型

按计算机的存储方式可将上面的数据类型分为两大类:整数类型和浮点数类型。

整数存储方式较为简单,如:

int 7

00000111

注意:这里是一个8位的字节。

浮点数存储较为复杂,简化理解,如:

float 3.14159

+ .314159 1 | | | 符号 小数 指数

过去浮点运算比整数运算慢,不过现在许多CPU都包含浮点处理器,缩小了速度上的差距。

4、位、字节和字

最小的存储单元是位(bit),可存入0或1,位是计算机内存的基本构建块。

字节(byte)是常用的计算机存储单位。几乎所有的机器,都是1字节8位。这是字节的标准定义,至少在衡量存储单位时是这样。在C语言中,把1字节定义为char类型占用的bit数

字(word)自然存储单位由若干个字节构成,64位计算机字长为64,32位计算机字长为32,字长越大,数据转移越快。

5、基本数据类型

5.1、int类型

int类型占用一个机器字长但是不超过32位,16位机int16位,32位机int32位,但是64位机int依旧是32位。因此int可代表的数范围为

其中第一位用来表示符号。

C语言通常假定整型常量为十进制数。但也可使用十六进制或八进制。

0x或0X前缀表示十六进制,使用%#0x或%#0X打印。

0前缀表示八进制,使用%#0打印。

5.2、其他整数类型

  • short int(或简写为short),占用存储空间可能比int类型小。

  • long int(或简写为long),占用存储空间可能比int类型多。

  • long long int (或简写long long),占用空间可能比long多,该类型最少64位。

  • unsigned int (或简写unsigned),用于非负值场景,由于没有符号,表示范围为

  • C90添加,unsigned long 、unsigned short。C99添加,unsigned long long。

  • signed,在任何有符号类型前添加,强调有符号,无特殊意义。

注意:在选择整数数据类型时,需要考虑到在不同位数机器上的可移植性,在此基础上尽量选择int类型。

前面提到编译器能够自动识别常量的数据类型,如果用户需要指定特定的类型,可在常量后添加对应的后缀。

  • long类型,L;不建议使用l
  • long long类型,LL;不建议使用ll
  • unsigned类型,U或u;

打印对应数据类型:

  • long类型,%l;
  • short类型,%h;
  • unsigned类型,%u;

5.3 、char类型

char本质上是整数类型。char存储的是整数。计算机使用特定字符集处理编码,如ASCII。char类型被定义为8位的存储单元。

在某些编译器中char被实现为有符号类型,范围-128~127;而无符号则为0~255。查阅相关手册或者查看limits.h头文件。

在char类型处理中文字符时,一般使用数组保存为一段字符串。

5.4、_Bool类型

_Bool类型本质上同样也是整数类型,它只占用一位存储空间,1表示true,0表示false。

5.5、可移植类型: stdint.h和inttypes.h

为避免不同系统下类型名不一致,C99添加了两个新的头文件。确保C语言的数据类型在各系统中的功能相同。

根据不同机器字长,头文件将自动替换不同搞得类型名。如:在32位系统中,int32_t是int别名,在16系统中,int32_t变成long的别名。

一共有三种,精确宽度整数类型,最小宽度整数类型,最快最小宽度类型。

5.6、浮点类型

C标准规定,float类型必须至少能表示6位有效数字,且取值范围至少是 通常,系统储存一个浮点数要占用32位。其中8位表示指数的值和符号,剩下24位表示非指数部分(尾数/有校数)及其符号。

double类型至少能表示10位有效数字。

%e %f

浮点数上溢 inf(infinite);

浮点数下溢 0.000000e+00

6、sizeof()

sizeof是C语言的内置运算符,以字节为单位给出指定类型的大小。C99和C11提供%zd转换说明匹配sizeof的返回类型。

7、printf()

printf()语句把输出发送到一个叫做缓冲区(buffer)的中间存储区域,然后缓冲区中的内容再不断被发送到屏幕上,当遇到:缓冲区满,遇到换行字符或者需要输入时刷新缓冲区。返回打印字符个数。

C与字符串

1、字符串简介

在C中字符串都被储存在char类型的数组中,没有专门用于储存字符串的变量类型。

字符数组末尾位置的字符“\0”为空字符,C语言用它标记字符串的结束。C中字符串一定以“\0”结束,这意味着数组的容量必须比待存储字符串中的字符数多1

字符串与字符的区别

“x”与‘x’

x\0与x

2、scanf()函数

scanf()函数在遇到第一个空白时就不在读取输入。scanf只读取一个单词,而不是一整句。

3、strlen()函数

strlen()函数给出字符串中的字符长度。注意strlen与sizeof的区别。strlen只给出字符的长度(除去‘\0’),sizeof给出整个数组的长度(包括’\0’)。