目录
数据类型
是数据在程序中的一种组织形式,任何一个程序都离不开数据,可以认为程序的本质就是在操作数据。为了提高运算能力,C 语言提供了丰富的数据类型,本章主要介绍 C 语言中常用的数据类型,掌握了这些常用的数据类型再去学习其他复杂的数据类型就容易很多。
变量和常量
在 C 语言中数据的表现形式分为两种:常量和变量。然而无论常量还是变量都具有数据类型,因此按照数据类型还可以对常量和变量再次进行划分。
常量:整型常量、浮点型常量、字符型常量。
变量:整型变量、浮点型变量、字符型变量。
常量 (也叫字面量/字面常量)指的是在程序运行过程中,值不能被改变的量。在程序中,常量只能被引用,不能被修改。在 C 语言程序中常用的常量类型有以下几种。
第一种,整型常量。例如:100、314、0、-200 等都是整型常量。
第二种,浮点型常量。浮点型常量其实就是数学中的小数。由数字与小数点组成,如 3.14、12.2、0.618、-1.7 等。
第三种,字符型常量。在程序中,使用英文单引号括起来的字符被称为字符型常量。例如:『a』、『1』、『=』、『?』、『#』等都是合法的字符常量。
变量 ,顾名思义就是可以改变的量。变量本质上是一块有名字的内存空间,用来存放数据。类似于生活中喝水的杯子,杯子的空间大小是固定的,但是杯中内容是可以变化的,可以装可乐、也可以装雪碧、还可以装咖啡。
总而言之,杯子是可以重复利用的,变量也是如此。内存空间大小是固定的,但是在程序运行期间变量中的内容是可以变化的,因此被称为变量。
在 C 语言中,一个合法的变量由 3 部分组成:变量类型、变量名、变量值。
变量类型:变量的类型用来规定变量对应内存空间的大小,如同杯子分小杯、中杯、大杯一样。
变量名:变量名用来标记变量对应的内存空间。如,有 10 个一模一样的杯子,从外表看无法区分。但是,如果给每个杯子都做一个标记,如依次贴上标签:「1 号」「2 号」……「10 号」,就不会混淆。同理,变量名也是同样的作用,通过变量名就可以精准地找到变量对应的内存空间。
变量值:变量值是变量名标记的内存空间中的数据,如同杯子中装的可乐、咖啡等。
基本数据类型
在 C 语言中数据类型分为常量与变量两种,但是不论是常量还是变量都是有数据类型的,常量的数据类型在使用时由系统自动给出,变量的数据类型在定义变量时,由用户指定。系统会根据变量的数据类型,在内存中开辟对应的内存空间,用于存储数据。
C 语言中数据分为两种:变量和常量。但是不论是变量还是常量都必须有数据类型。常量的数据类型在引用时自动声明,如 1、20、500 表示整数类型常量,3.14、6.18 表示浮点类型常量,『a』、『b』表示字符类型常量。而变量的数据类型在变量定义时,通过 char、short、int、float、double 等关键字指定。
C 语言中,定义变量的一般形式为:
变量类型 变量名 = 变量值;
例如:
int a = 100;
说明:
(1)变量类型就是变量可以保存的数据类型。
(2)int 是关键字,表示变量类型为整数类型,用于修饰变量。
(3)a 是变量名,必须是合法的标识符。
(4)这里的「=」并不是数学中的等号,而是赋值运算符,表示将「=」右侧的数据赋给「=」左侧的变量。
(5)100 是赋给变量 a 的值。
数据类型的意义
为了形象地理解数据与数据类型的意义,这里以水果与盒子为例,可以把数据比作各种水果,把数据类型比作盒子的型号。当存放樱桃时,需要小盒子;当存放苹果时,需要中等盒子;当存放哈密瓜时,需要大盒子
通过上述分析,可以看到水果的种类不同,对应盒子的规格也不一样,其实数据与数据类型也是如此。在 C 语言程序中,无论是常量还是变量,最终都存储在计算机内存中。不过由于常量或变量的类型不同,导致需要的存储空间大小不同。为了解决这种问题,C 语言引入了数据类型,在程序编译期间,编译器会根据常量或变量的类型分配对应大小的内存空间来保存数据。
整数类型简称整型,在 C 语言中整型有以下几种。
(1)基本整型(int)。
(2)短整型(short int 或 short)。
(3)长整型 (long int 或 long)。
(4)双长整型(long long int 或 long long)。
在实际编程中最为常用的是基本整型(int),本节将详细介绍,其他整数类型在后续章节中使用到时再作介绍。
基本整型(int)
在 32 位操作系统下,C 语言编译器会给基本整数类型数据或变量分配 4 字节内存空间。int 类型表示的范围为:-2147483648~2147483647。程序中在变量名前面加关键字 int 可以定义整数类型变量(简称整型变量),如 int a。int 类型数据在 printf 函数中一般采用%d 格式进行输出,其中 d 表示十进制整数形式。
示例 整型变量的定义与输出(程序汇总一讲过 可类比)
1 #include<stdio.h>
2 int main()
3 {
4 int a=200;//定义了一个变量a 赋值为200
5 printf("%d\n",a);
6 getchar();
7 return 0;
8 }
浮点数类型
又称实数类型,在 C 语言中浮点数类型有以下几种。
(1)单精度浮点型(float)。
(2)双精度浮点型(double)。
(3)长双精度浮点型(long double)。
在实际编程中最为常用的是单精度浮点类型(float)。
单精度浮点型(float)
在 32 位操作系统下,C 语言编译器会给单精度浮点型数据或变量分配 4 个字节的内存空间。程序中在变量名前加关键字 float 可以定义单精度浮点型变量,如 float f;。float 型数据能得到 6~7 位有效数字,取值范围为:-3.4×1038~3.4×1038,float 类型数据在 printf 函数中一般采用%f 格式进行输出,f 表示「十进制小数」形式。
在 C 语言中,字符类型只有一种:
字符类型(char)。
32 位操作系统下,C 语言编译器会给字符型数据分配 1 个字节内存空间。程序中在变量名前面加关键字 char 可以定义字符型变量,如:
char c;
char 类型取值范围为:-128 ~127,char 类型数据在 printf 函数中一般采用%c 格式进行输出,c 表示「字符」形式。
字符串
在 C 语言中是没有字符串类型的,所谓的字符串本质上是由单个的字符构成。例如,「www. rupeng.com」,可以看作由字符『w』、『w』、『w』、『.』、『r』、『u』、『p』、『e』、『n』、『g』、『.』、『c』、『o』、『m』组成。其实在计算机底层,字符串是被拆分为单个字符进行存储的,输出时也按照存储的顺序连续输出。做个形象的比喻:如果把字符串当作一串糖葫芦,字符就是每一个山楂
关键字
又称「保留字」。C 语言中一共有 32 个关键字,每个关键字都有其特殊的意义,一般用于对语句、数据类型、变量属性进行说明、约束,不能用作其他用途。在编写 C 语言程序时,用户自定义的变量名、函数名被称为「标识符」。标识符不能是关键字,否则就是非法的标识符,编译时系统会报错。
32个关键字 (先不用急着背,逐步了解)
auto double int struct break else long switch case enum register typedef char extern return union const float short unsigned continue for signed void default goto sizeof volatile do if while static
标识符
在 C 语言中,用来对变量、函数、数组等命名的字符序列被称为标识符,如变量名 a、函数名 printf 等都是标识符。
C 语言对标识符有以下规定。
(1)只能由 26 个英文字母、数字和下划线 3 种字符组成。
(2)第 1 个字符只能是字母或下划线。
(3)区分大小写。
(4)不能是关键字。
printf
常用的数据类型在printf中对应的占位符
printf 中数据类型一定不能用错,float 类型必须使用%f;int 类型必须使用%d。如果使用错了就会产生错误的结果。如下面的错误代码:
printf("%f",3);
printf("%d",3.14);
从原理层面上分析,这涉及到数据在内存中表示格式的问题,初学阶段不用深入研究。另外,在 printf 中也可以同时使用多个占位符,只要前后和参数的类型、个数能够对得上就行,例如:
printf("name=%s , age=%d , height=%f" , "rupeng" , 18 , 3.14);
注释
C 语言中允许使用(双斜线)//注释一行代码,使用/* */注释多行代码,被注释的代码会被编译器忽略。
注释的作用主要有以下两点。
(1)方便自己和他人理解这段代码。
(2)屏蔽无用的代码,经常用于调试程序,缩小错误范围。
变量详解
在 C 语言中,变量只有被定义才能使用,定义变量有两种形式。
第一种,先定义,后赋值。具体语法如下。
变量类型 变量名;
变量名 = 数据;
例如:
int a; //先定义 int 型变量 a
a =200; //然后将 200 赋值给变量 a
第二种,定义并赋值。具体语法如下。
变量类型 变量名 = 数据;
例如:
int a=200; //定义 int 变量 a 并赋值为 200
【变量说明】
1.在程序中变量是用来保存数据的,一般情况下,数据的类型与变量的类型保持一致。如果要保存整数,变量类型应该声明为 int;如果要保存字符,变量类型应该声明为 char;如果要保存小数,变量类型应该声明为 float 或 double。
2.程序中的「=」是赋值操作,例如,a=200,表示将 200 赋值给变量 a,并不是数学中的相等比较,C 语言中相等比较采用「==」
定义变量的目的在于方便引用,在 C 语言中引用变量分为两种情况。
(1)对变量进行赋值。
(2)读取变量中保存的数据。
那么该如何区分这两种情况?其实很简单,如果变量出现在「=」左边,就是对变量进行赋值,例如,
a =100;
如果变量出现在「=」右边或单独出现,就是读取变量中保存的数据。例如:
a=100;
b=200;
a=b;
printf(“%d\n”,a);
上述程序的第 3 行中变量 a 在「=」左边,变量 b 在「=」右边。因此,a=b 执行过程为:先读取变量 b 中保存的数据 200,然后赋值给变量 a,此时变量 a 的值为 200。
上述第 4 行中在 printf 函数中变量 a 是单独出现的,表示读取变量 a 中保存的数据。
下面通过例子来了解变量的定义与引用。
变量定义与引用。
01 #include<stdio.h>
02 int main()
03 {
04 int a=100; //定义 int 变量 a 并赋值为 100
05 int b; //先定义 int 变量 b
06 b=200; //然后将 200 赋值给变量 b
07 a=b; //将变量 b 的值赋值给变量 a
08 printf(「a=%d\n」,a); //输出变量 a 的值
09 printf(「b=%d\n」,b); //输出变量 b 的值
10 getchar();
11 return 0;
12 }
我们已经看到在程序中可以定义多个变量。C 语言中,定义多个变量有两种形式。
第一种,在一行语句中,定义多个变量,语法结构为:
变量类型 变量名 1,变量名 2,变量名 3…… //变量之间以逗号分割
第二种,多行语句,定义多个变量,语句结构为:
变量类型 变量名 1;
变量类型 变量名 2;
……
例如:
int a=100,b=200; //一行定义 int 变量 a、b 且赋值
int c=300; //定义变量 c 且赋值
int d=400; //定义变量 d 且赋值
在 C 语言中,程序执行的最小单位为语句,一条合法的语句必须在末尾有一个分号,分号是语句不可缺少的组成部分。
C 语言中常用的语句
有以下 5 种。
(1)赋值语句。
(2)函数调用语句。
(3)空语句。
(4)复合语句(语句块)。
(5)控制语句。
暂且只前 4 种语句,第 5 种控制语句会在后续介绍。
1. 赋值语句
赋值语句是 C 语言程序中最基本的语句,需要使用赋值符号「=」,该符号的作用是将一个数据赋值给一个变量,例如:
a = 100; //将 100 赋值给变量 a
注意:赋值语句中,赋值号「=」的左边必须是变量,不能是常量,否则程序编译时会报错。
2. 函数调用语句
函数调用语句是 C 语言程序中,比较常用的语句,由函数调用语句与分号构成,例如:
printf("辽G.默语");
该语句由函数调用 printf(辽G。默语)与末尾的分号构成,对于该语句暂时只需简单了解即可。
3. 空语句
该语句只有一个分号,例如:
;
那它有什么作用呢?空语句经常作为循环语句的循环体,表示什么也不做。
4. 复合语句(语句块)
复合语句又被称为语句块,在程序中,使用{ }将多行语句括起来就可以成为复合语句,例如:
{
int a=3;
printf("a=%d\n",a);
}
左花括号「{」表示复合语句开始,右花括号「}」表示复合语句结束。复合语句不会影响程序的正常执行,常常和控制语句一起使用。
顺序结构
顺序结构是 C 语言程序中最简单的程序结构。顺序结构的程序从第一行语句开始,按照代码排列的顺序,从上至下逐句执行,上一条语句执行结束下一条语句才能执行,直到最后一条语句结束。
变量位置
C 语言中,变量定义的位置可以有以下 3 种。
(1)在函数内定义。
(2)在函数内的语句块中定义。
(3)在函数外部定义。
根据变量定义的位置,又可以将变量分为两种:局部变量和全局变量。局部变量只在被定义的函数中有效,而全局变量在整个源程序文件中都有效。
1.局部变量与全局变量
在函数内部定义的变量被称为局部变量,在函数外部定义的变量被称为全局变量。前几章编写的 C 语言程序中只包含一个 main 函数,并且变量也都定义在 main 函数中,因此前几章中定义的变量都是局部变量。
2. 局部变量定义的位置
局部变量定义必须放在函数开头,或函数内语句块的开头,并且必须放在执行语句之前,如赋值语句、函数调用语句等,否则程序编译无法通过。
变量的初始化
在 C 语言中,第一次对变量进行赋值的操作被称为初始化。变量的初始化分为以下两种情况。
第一种,定义变量并且初始化,例如:
int a = 10; //定义并且初始化
第二种,先定义,后初始化,例如:
int a;
a=10;
2. 变量初始化与赋值的区别
变量初始化的本质就是赋值,不过只有第一次给变量赋值的操作才能被称为初始化。而变量赋值的次数没有限制了,可多次进行赋值。
3. 未初始化的问题
在 C 语言中,如果定义了局部变量,但是并未进行初始化,那么编译器并不会自动初始化局部变量,该局部变量的值将是未知的。因此,在程序中使用这样的变量是存在风险的。为了防止这种情况发生,在 VS2012 中,如果程序中使用了没有初始化的局部变量,运行程序时将会报错