【高级语言程序设计】第 3 章:数据类型、运算符和表达式

目录

一、数据类型

(1)脑图

(2)数据类型

二、常量 

 (1)整型常量

(2)实型常量

(3)字符常量

(4)字符串常量

(5)符号常量

三、变量

(1)变量的定义 

(2)变量的初始化

(3)有名常量的定义 

 (4)整型变量

(5)实型变量

(6)字符型变量

四、运算符和表达式

(1)运算符

① 算术运算符

② 自增、自减运算符

③ 关系运算符

④ 逻辑运算符

⑤ 基本赋值运算符

⑥ 复合赋值运算符

⑦ 逗号运算符

⑧ 条件运算符

⑩ 位移位运算符

 (2)表达式

① 算术表达式

② 关系表达式

③ 逻辑表达式

④ 赋值表达式

⑤ 逗号表达式

五、数据类型转换

(1)自动类型转换 

(2)赋值类型转换

(3)强制类型转换



一、数据类型

(1)脑图


(2)数据类型

数据:数据既是程序加工和处理的对象,也是程序加工和处理的结果。
  • 基本类型:包括整型、实型(又称浮点型)、字符型和枚举型四种。
  • 构造类型:是由基本数据类型按一定规则组合而成的复杂数据类型,包括数组型、结构体类型和共用体类型。
  • 指针类型:是一种更加灵活的数据类型,用来表示内存地址。
  • 空类型:是从语法完整性角度给出的数据类型,表示不需要数据值,因而没有类型。


二、常量 

常量:常量又称为常数,是在程序运行过程中其值不能改变的数据。 

 (1)整型常量

整型常量:整型常量通常称为整数,不带有小数部分,包括正整数、负整数和 0 。
C 语言中,整型常量有三种书写形式:
  • 八进制整型常量:必须以 0 开头,即以 0 作为八进制整数的前缀,是由数字 0~7 组成的数字串。
  • 十进制整型常量:即通常的整数,没有前缀,是由数字 0~9 组成的数字串,是 C 语言中用的最多的一种形式。
  • 十六进制整型常量:必须以 0X 或 0x 开头,即以 0X 或 0x 作为十六进制整数的前缀,是由字符 0~9 、a~f 或 A~F 组成的字符串。

(2)实型常量

实型常量:实型常量又称为浮点型常量或实数,实型常量只使用十进制。

C 语言的实型常量有两种书写形式:
  1. 十进制小数形式:由整数部分、小数点和小数部分组成,其中小数点必须有,整数部分和小数部分可以省略其中一个,正、负通过前面的 “+”(可以省略)和 “-” 区分。
  2. 指数形式(用 E 或 e 表示):由尾数部分、阶码标志(小写字母 e 或大写字母 E )和指数部分组成,其一般形式为 aEb 或 aeb ,其中尾数部分 a 的位数决定了数值的精度,指数部分 b 的位数决定了可表示的数值范围。 a 和 b 均有正负之分,且 b 必须为整数。

(3)字符常量

字符常量:字符常量包括普通字符常量和转义字符常量两种。

  • 普通字符常量是用一对单引号括起来的单个字符,例如 ‘a’ 、 ‘?’ 均为普通字符常量。C 语言还允许使用一种特殊形式的字符常量,即以反斜杠 “\” 开头的转义字符,它只代表某一特定的 ASCII 码字符。
  • C 语言规定字符常量中的字母是区分大小写的。
  • 每个字符常量在内存中占用 1 字节,具体存放的是该字符对应的 ASCII 码值。
  • 需要注意的是,C 语言中空字符和空格符号不同。空字符用转义字符 “\0” 表示,其值是 0 ;空格符号是 ASCII 字符集中的一个可显示字符,其 ASCII 值是 32 ,在屏幕上显示为空格。


(4)字符串常量

字符串常量:字符串常量又称为“字符串” ,是用双引号括起来的零个或多个字符的序列。

  • 字符串中字符的个数称为字符串长度。
  • 编译时自动在字符串的末尾处加一个转义字符 ‘\0’ 作为字符串的结束标志,即长度为 n 个字符的字符串占用 n+1 字节
字符常量与字符串常量是不同的,其区别在于:
  1. 定界符不同:字符常量使用单引号,而字符串常量使用双引号。
  2. 长度不同:字符常量的长度固定为 1 ;而字符串常量的长度,可以是 0 ,也可以是某个整数。
  3. 存储要求不同:字符常量存储的是字符的 ASCII 码值,在内存中只占用 字节;而字符串常量,除了要存储有效的字符外,还要存储一个字符串结束标志 ‘\0’  。


(5)符号常量

符号常量:符号常量使用之前必须先定义。

符号常量定义的一般格式:

#define 符号常量 常量
  • 其中,常量可以是任意类型。
  • 符号常量一般采用大写字母表示,而变量一般采用小写字母表示。
  • 符号常量的定义一般放在程序的开头,每个定义必须独占一行,因为不是语句,所以后面没有分号“;” 。
使用符号常量的优势在于:
  1. 提高程序的可读性
  2. 便于程序修改



三、变量

(1)变量的定义 

变量的定义:其值可以改变的量,C 语言规定,任何变量 必须先定义后使用
对变量进行定义时,需要注意以下几个方面:
  1. 变量定义可以存放在函数之外,也可以放在函数体或符合语句中。
  2. 被定义为整型(包括 int、short 和 long )的变量,若其值为 -128~127 ,则可以作为字符型变量使用。
  3. 被定为无符号整型(包括 unsigned、unsigned short 和 unsigned long)的变量,若其值 0~255 ,也可以作为字符型变量使用。
  4. 被定义为字符型的变量,可以作为整型(包括 int、short 和 long)变量使用,其将值为 -128~127 ,也可以作为无符号整型(包括 unsigned、unsigned short 和 unsigned long )变量使用,其值将为 0~255 。
  5. 变量定义后,系统自动为其分配连续的内存单元,所占用的内存字节数取决于变量的数据类型。
变量定义语句的一般格式:
  • 数据类型符 变量名1[,变量名2,…];
定义格式:
  • 数据类型 变量名;

变量应该有名字,并在内存中占据一定的存储单元变量名和变量值有不同的含义。


(2)变量的初始化

变量的初始化:是给变量赋值的一种方式,定义变量的同时给变量赋初值称为变量的初始化。
变量初始化语句的一般格式:
  • 数据类型符 变量名1=初值1[,变量名2[=初值2],...];

示例:

int radius=2,area;
short m=1,n=2;
long l1=123L,l2;


(3)有名常量的定义 

有名常量的定义: C 语言中,如果定义了变量并赋予其初值,但不希望在程序中对其值进行修改,则可以将该变量定义为有名常量。
有名常量定义语句的一般格式:
  • const 数据类型符 变量名1=初值1[,变量名2=初值2,...];
示例:
const int j=1,k=2;
const char ch1= ‘
y’ ,ch2= ‘N’;

 (4)整型变量

整型变量分为四种:

  1. 基本整型:类型关键字为 int
  2. 短整型:类型关键字为 short[int]
  3. 长整型:类型关键字为 long[int]
  4. 无符号整型:又称为无符号基本整型(unsigned [int])、无符号短整型(unsigned short)和无符号长整型(unsigned long)三种。
  • 在 16 位编译器中:一般一个 int 型变量占用 2 字节,且 long 型( 4 字节)≥ int 型( 2 字节)≥ short 型( 2 字节)
  • 在 32 位编译器中:一个 int 型变量占用 4 字节,long 型变量占用 4 字节,short 型变量占用 2 字节

(5)实型变量

实型变量分为两种:
  1. 单精度实型:类型关键字为 float ,一般占用内存 4 字节,保留 6~7 位有效数字。
  2. 双精度实型:类型关键字为 double ,一般占用内存 8 字节,保留 15~16 位有效数字。
例如:
float a;
a=123456.789  //实际 a 的值是 123456.7
double b;
a=123456.789  //实际 b 的值是 123456.789

(6)字符型变量

  • 字符型变量的类型关键字是 char ,存放的是字符的 ASCII 码值(无符号整数),占用内存 1 字节
  • 需要注意的是,字符串只能是常量,C 语言中没有字符串变量,而是用字符数组存放字符串变量



四、运算符和表达式

(1)运算符

运算符: 运算符是进行各种运算的符号,例如常用的加、减、乘、除符号,即是运算符。

结合性:是 C 语言的独有概念。除 单目运算符、赋值运算符和条件运算符是右结合 之外,其他的运算符都是左结合。

① 算术运算符

算术运算符:包括  + - * / % + (取正)和  - (取负)。

算术运算符的优先级如下:

  1. 单目运算符 +的优先级相同,结合性是从右至左。
  2. 双目运算符 * /的优先级相同,结合性是从左至右。
  3. 双目运算符 +的优先级相同,结合性是从左至右。
  4. 单目算术运算符优先于双目算术运算符。
  5. * /优先于 +
需要注意的是:
  • 除法运算的结果和运算对象的数据类型有关,若两个整数相除,则运算称为整除,其商为整数,小数部分被舍弃。
  • 模运算,要求两侧的运算对象必须为整型,否则出错。


② 自增、自减运算符

自增、自减运算符:分别为  ++  和  --  ,它们都是单目运算符,用于对整型、字符型和指针型变量的值加 1  和减  的运算,运算结果仍是原来的数据类型。
  • 运算符放在变量之前:即 ++ 变量、 -- 变量,则先使变量的值加(或减 ),然后再以变化后的值参与其他运算,即先加(或减)1、后运算。
  • 运算符放在变量之后:即变量 ++ 、变量 -- ,则变量先参与其他运算,然后再使变量值加(或减)1,即先运算、后加(或减)1

示例:

j=3; k=++j;             //k=4,j=4
j=3; k=j++;             //k=4,j=4
j=3; printf(“%d”,++j);  //4,j=4
j=3; printf(“%d”,j++);  //3,j=4
a=3;b=5;c=(++a)*b;      //c=20,a=4
a=3;b=5;c=(a++)*b;      //c=15,a=4

自增、自减运算符的优先级如下:
  1. 自增和自减运算符优先于双目算术运算符;
  2. 自增、自减运算符和单目算术运算符 +的优先级相同,结合性是从右至左。

使用自增、自减运算符时,需要注意以下几点:

  1. 自增、自减运算,常用于循环语句中,使循环控制变量加(或减)1,以及指针变量中,使指针向下(或上)一个地址。
  2. 自增、自减运算符,不能用于常量和表达式。
  3. 在表达式中连续使同一个变量进行自增或自减运算时,很容易出错,所以最好避免这种用法。

③ 关系运算符

关系运算符:关系运算符包括 >  >=  <=  ==  和 ! 六种,它们是双目运算符。
  • 本质上,关系运算符是比较运算,即两个数据进行比较,判断两个数据是否符合给定的关系
  • 如果关系运算的结果是逻辑值 “(即关系成立),用整数 “1” 表示
  • 如果关系运算的结果是逻辑值 “(即关系不成立),用整数 “0” 表示

关系运算符的优先级如下:
  1. 算术运算符优先于关系运算符
  2. > 、>= 、< 、<= 优先于 == 、!= 
  3. > 、>= 、< 、<= 的优先级相同,结合性是从左至右
  4. == 、!= 的优先级相同,结合性是从左至右
需要注意的是,C 语言中 “等于” 这一关系运算符是双等号 “ == ” ,而不是单等号 “ = ”(赋值运算符)

主要注意的点:

  • C 语言中 “等于” 这一关系运算符是双等号 “ == ” ,而不是单等号 “ = ”(赋值运算符) 

④ 逻辑运算符

逻辑运算符:包括 && 、|| 和 !三种。

逻辑运算符的优先级如下:
  1. !优先于双目算术运算符优先于关系运算符优先于 && 优先于 || 。
  2. 单目逻辑运算符 !和单目算术运算符的优先级相同,结合性均从右至左。
  3. 双目逻辑运算符 “&&” 和 “||” 的结合性是从左至右。
主要注意以下几点:
  1. 对于逻辑运算结果, “1” 表示逻辑真, “0” 表示逻辑假;对于逻辑运算对象 “非 0 ” 表示逻辑真, “0” 表示逻辑假。
  2. 逻辑与 “&&” 相当于 “同时” ,逻辑或 “||” 相当于 “或者” ,逻辑非 “!” 相当于 “否定” 。
  3. 逻辑运算符两侧的运算对象可以是任何类型的数据,如整型、实型、字符型等。
  4. 一旦 “&&” 和 “||” 能够确定表达式的值,则不再继续运算,即并不是所有的表达式都被运算。

⑤ 基本赋值运算符

基本赋值运算符:即赋值运算符“ = ” ,它是双目运算符,赋值运算符的左边必须是变量,右边是表达式,其作用是将一个表达式的值赋给一个变量。

赋值运算符的优先级:
  1. 算术运算符优先于关系运算符优先于双目逻辑运算符优先于赋值运算符
  2. 赋值运算符的结合性是从右至左

⑥ 复合赋值运算符

复合赋值运算符:是在赋值运算符的前面再加一个双目运算符构成的,它是双目运算符,复合赋值运算符的左边必须是变量,右边是表达式。
复合赋值运算符的一般使用形式:
  • 变量 双目运算符=表达式 等价于 变量=变量 双目运算符 (表达式)
复合赋值运算符的优先级:
  1. 算术运算符优先于关系运算符优先于双目逻辑运算符优先于复合赋值运算符
  2. 复合赋值运算符和赋值运算符的优先级相同,结合性都是从右至左


⑦ 逗号运算符

逗号运算符:又称为顺序求职运算符,它是双目运算符,运算对象是表达式,常用于 for 循环语句中。

逗号运算符的优先级:
  1. 任何运算符优先于逗号运算符,即逗号运算符的优先级最低。
  2. 逗号运算符的结合性是从左至右。
需要注意的是,并不是任何地方出现的逗号都是逗号运算符。很多情况下,逗号仅用作分隔符。

⑧ 条件运算符

条件运算符:是 C 语言中唯一的一个三目运算符,它是由 ?和 :组合成的,其三个运算对象均为表达式,其中第一个运算对象可以是任何类型的表达式,通常理解为逻辑表达式。
条件运算符的一般使用形式:
  • 表达式1?表达式2:表达式3
条件运算符的执行过程是先 表达式1 ,若非 0,则条件表达式的值是 表达式2 的值;若为 0 ,则条件表达式的值是 表达式3 的值。
示例:
int i=1,j=1,k=2,m=0;
i==j?(k=3) : (m=-3)   // 3,k的值是3,i,j,m的值不变
条件运算符的优先级:
  1. 其他运算符优先于条件运算符优先于赋值和复合赋值运算符优先于逗号运算符
  2. 条件运算符的结合性是从右至左

⑨ 位逻辑运算符

位逻辑运算符:将数据中的每个二进制位上的 “0” 或 “1” 作为逻辑值,按位进行逻辑运算。
  • 位逻辑运算符分为按位非、按位与、按位或和按位异或(又称按位加)四种,其中按位非是单目运算符,其余三种都是双目运算符。

示例:

3&9=00000001

3|9=00001011

3^9=00001010

位逻辑运算符的优先级:
  1. ~ 优先于双目算术运算符优先于关系运算符优先于 & 优先于 ^ 优先于 | 优先于双目逻辑运算符
  2. ~ 与单目逻辑运算符、自增、自减、单目算术运算符、长度运算符的优先级相同,结合性是从右至左
主要注意以下几点:
  1. 运算对象只能是整型或字符型数据。除按位非为单目运算符外,其余均为双目运算符。
  2. 参与位逻辑运算时,运算对象以二进制形式进行相应的按位运算。


⑩ 位移位运算符

位移位运算符:是将数据作为二进制数,进行向左或向右移动若干位的运算,分为左移和右移两种,均为双目运算符,其中第一个运算对象的移位对象,第二个运算对象是移动的二进制位数。

位移位运算符的优先级:
  1. 算术运算符 优先于位移位运算符优先于关系运算符
  2. 位移位运算符的优先级相同,结合性是从左至右

示例:

主要注意以下几点:
  1. 运算对象只能是整型或字符型数据
  2. 参与位移位运算时,运算对象以二进制形式进行相应的按位运算

⑪ 长度运算符

长度运算符:是单目运算符,其运算对象可以是任何数据类型符或变量。

长度运算符的使用形式:

  • sizeof(数据类型符)或sizeof(变量) 

长度运算符的优先级:
  1. 与单目算术运算符、单目逻辑运算符、自增和自减运算符的优先级相同
  2. 上述优先级相同的运算符的结合性都是从右至左

示例:


 (2)表达式

① 算术表达式

算术表达式:表达式中的运算符都是算术运算符的称为算术表达式,通常算术表达式由运算 对象(常量、变量和函数等)、圆括号和算术运算符组成。
算术表达式的构成规则如下:
  1. 数值型常量、数值型变量和数值型函数调用是算术表达式。
  2. +(算术表达式)、-(算术表达式)是算术表达式。
  3. ++ 整型变量、-- 整型变量、整型变量 ++ 、整型变量 -- 是算术表达式。
  4. (算术表达式)双目算术运算符(算术表达式)是算术表达式。
  5. 有限次地使用上述规则获得的表达式都是算术表达式。

② 关系表达式

关系表达式:关系表达式是用关系运算符将两个表达式连接起来的表达式。
关系表达式的一般形式:
  • 表达式 关系运算符 表达式

表达式主要是算术表达式,也可以是字符型数据或关系表达式、逻辑表达式、条件表达式、赋值表达式、逗号表达式等。由于条件、赋值、逗号运算符的优先级低于关系运算符,所以应注意加圆括号。


③ 逻辑表达式

逻辑表达式:是用逻辑运算符将一个或多个表达式连接起来,进行逻辑运算的式子。
逻辑表达式的构成规则:
  • 单目逻辑运算符 表达式
  • 表达式 双目逻辑运算符 表达式
其中,表达式主要是关系表达式,也可以是字符型数据或算术表达式、条件表达式、赋值表达式、逗号表达式等。由于条件、赋值、逗号运算符的优先级低于逻辑运算符,所以应注意加圆括号。

④ 赋值表达式

赋值表达式:由赋值运算符或复合赋值运算符将一个变量和一个表达式连接起来的表达式,称为赋值表达式。

赋值表达式的构成规则:
  • 变量=表达式
  • 变量 复合赋值运算符 表达式
其中,表达式可以是算术表达式、关系表达式、逻辑表达式、条件表达式、赋值表达式和逗号表达式等。由于逗号运算符的优先级低于赋值运算符,所以应注意加圆括号。
示例:
a=b=c=5         //表达式值为5,a,b,c值为5
a=(b=5)         // b=5;a=5
a=5+(c=6)       //表达式值11,c=6,a=11
a=(b=4)+(c=6)   //表达式值10,a=10,b=4,c=6
a=(b=10)/(c=2)  //表达式值5,a=5,b=10,c=2

⑤ 逗号表达式

用逗号运算符把两个或多个表达式连接起来构成逗号表达式,构成规则:
  • 表达式1,表达式2
其中,表达式可以是算术表达式、关系表达式、逻辑表达式、条件表达式、赋值表达式和逗号表达式等。

示例:

//逗号表达式使用
main()
{ int x,y=7;
float z=4;
x=(y=y+6,y/z);
printf("x=%d\n"
,x);
}

// 运算结果:X=3
a=3*5,a*4      //a=15,表达式值60
a=3*5,a*4,a+5  //a=15,表达式值20
x=(a=3,6*3)    //赋值表达式,表达式值18,x=18
x=a=3,6*a      //逗号表达式,表达式值18,x=3
a=1;b=2;c=3;
printf(“%d,%d,%d”,a,b,c);        //1,2,3
printf(“%d,%d,%d”,(a,b,c),b,c);  //3,2,3


五、数据类型转换

(1)自动类型转换 

自动类型转换:参与运算的各个数据都转换成数据较长的数据类型,然后计算,结果的类型
就是数据长度较长的数据类型。
  • 本质上是较低类型的转换,即 “就高不就低” 或 “就长不就短” 的原则


(2)赋值类型转换

赋值类型转换: 先将运算结果的数据类型自动转换为左边变量的数据类型,然后再赋予该变

量。
  • 本质上是 “就左不就右” 的转换原则。
示例:
设 int a=1;float b=2.1;char c= ’a’;
则表达式 a=b+c 的计算过程是先计算 b+c ,按照 “就高不就低” 的规则,将 c 转换为实型(变量 c 的值是 97 ,转化为 97.0 ),计算结果是实型,即 99.1 ,由于变量 a 是整型,按照 “就左不就右” 的规则,所以将实型自动转换为整型赋予变量 a ,即 99 赋值给变量 a 。

(3)强制类型转换

强制类型转换:除了自动类型转换和赋值类型转换外,C语言也允许强制类型转换。

数据类型强制转换的一般格式:
  • (数据类型符)(表达式)
C 语言首先按照自动类型转换原则计算表达式的值,然后将其转换为指定的数据类型。
需要注意的是,若表达式仅仅是单个常量或变量时,外面的一对圆括号可以省略;若是含有运算符的表达式,则必须用一对圆括号括起来。
示例:

进行数据类型转换时,需要注意以下几点:
  1. 强制类型转换获得的是一个所需类型的中间量,原来表达式的类型并不发生变化。
  2. 表达式计算过程中,参与运算的常量或变量的类型自动转换是临时的,它仅产生一个临时的、类型不同的数据参与运算,常量或变量的原类型和值均不改变。
  3. 运算结果赋予变量的类型转换过程中,无论是自动变量的还是强制的,当数据长度较长的结果存入数据长度较短的变量时,将截去超出的部分,有可能造成错误。
  4. 数据类型转换将占用系统时间,过多的转换将降低程序的运行效率,所以除了必要的数据类型转换外,应尽量选择好数据类型,避免不必要的转换。

猜你喜欢

转载自blog.csdn.net/qq_39720249/article/details/129891802