高级语言程序设计(C语言)----第三章(下) 数据类型、运算符和表达式

本文详细介绍了C语言中的运算符和表达式,包括运算符的分类、结合性、算术运算符、自增自减运算符、关系运算符、逻辑运算符、赋值运算符、复合赋值运算符、条件运算符、位逻辑运算符和位移位运算符。此外,还讨论了数据类型转换,包括自动类型转换和强制类型转换的原则与注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

3.4. 运算符和表达式

3.4.1. 运算符

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

3.4.1.1. 运算符分类

C语言运算符的分类
C语言运算符的分类

3.4.1.2. 结合性 (*)

结合性是C语言的独有概念。除单目运算符赋值运算符条件运算符是右结合之外,其他的运算符都是左结合。
C语言运算符的优先级和结合性
优先级1: ()小括号,[ ]中括号;后面两个 -> 与 . 是成员运算符,一般用于程序中通过实体类获取其属性或者方法。
优先级2: !逻辑运算符 用于取否,对于逻辑运算结果,“1”表示逻辑真,“0”表示逻辑假;对于逻辑运算对象“非0”表示逻辑真,“0”表示逻辑假。即 !0为真,!1为假;
~ 按位非位运算符,作用是将每位二进制取反。 十进制2的二进制表示为: 00000010 每位都取反:
 11111101 这是内存中的保存形式。
 ++自增,–自减,sizeof 判断数据类型长度
优先级3: (乘),/ (除),% (相除后取余数)
优先级4: + (加),-(减)
优先级5: 位移运算符 , << 代表向左移,移动n位,原数
2的n次方,>>代表向右移动,移动n位,原数除以2的n次方。例如: 5<<3 等于 5* 23 ,结果是40.
笔记
右结合:从右至左;
左结合:从左至右;
单目:指参与运算的只有一个变量,比如:i++ ;
双目:就i是参与运算的是两个变量,比如: a+b;

优先级从高到底,大方向上是根据先算术运算符,后逻辑运算符。

3.4.2. 算术运算符

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

3.4.3. 自增、自减运算符

自增和自减运算符分别为++和–,它们都是单目运算符,用于对整型、字符型和指针型变量的值加1和减1的运算,运算结果仍是原来的数据类型。
自增、自减运算符
笔记: 单目运算符,都是从右向左的。
1、运算符放在变量之前,即++变量、–变量,则先使变量的值加(或减1),然后再以变化后的值参与其他运算,
即先加(或减)1、后运算。
2、运算符放在变量之后,即变量++、变量–,则变量先参与其他运算,然后再使变量值加(或减)1,即先运算、后加(或减)1。
自增、自减运算符解析
在这里插入图片描述
使用自增和自减运算符时,需要注意以下几点:
1、自增、自减运算,常用于循环语句中,使循环控制变量加(或减)1,以及指针变量中,使指针向下(或上)一个地址。
2、自增、自减运算符,不能用于常量和表达式。
3、在表达式中连续使同一个变量进行自增或自减运算时,很容易出错,所以最好避免这种用法。

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

3.4.4. 算术表达式

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

3.4.5. 关系运算符

关系运算符包括>、>=、<、<=、== 和 != 六种,它们是双目运算符。
本质上,关系运算符是比较运算,即两个数据进行比较,判断两个数据是否符合给定的关系。
如果关系运算的结果是逻辑值“真”(即关系成立),用整数“1”表示;
如果关系运算的结果是逻辑值“假”(即关系不成立),用整数“0”表示。
关系运算符
关系运算符的优先级如下:
1、算术运算符优先于关系运算符。
2、>、>=、<、<=优先于 = = 、!=。
3、>、>=、<、<=的优先级相同,结合性是从左至右。
4、= =、!=的优先级相同,结合性是从左至右。
笔记:需要注意的是,C语言中“等于”这一关系运算符是双等号“==”,而不是单等号“=”(赋值运算符)。

3.4.6. 关系表达式

定义:关系表达式是用关系运算符将两个表达式连接起来的表达式。
格式:关系表达式的一般形式:表达式 关系运算符 表达式
表达式主要是算术表达式,也可以是字符型数据或关系表达式、逻辑表达式、条件表达式、赋值表达式、逗号表达式等。
由于条件、赋值、逗号运算符的优先级低于关系运算符,所以应注意加圆括号。

3.4.7. 逻辑运算符

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

3.4.8. 逻辑表达式

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

3.4.9. 基本赋值运算符

基本赋值运算符即赋值运算符“=”,它是双目运算符,赋值运算符的左边必
须是变量,右边是表达式,其作用是将一个表达式的值赋给一个变量。
基本赋值运算符
赋值运算符的优先级:
1、算术运算符优先于关系运算符优先于双目逻辑运算符优先于赋值运算符;
2、赋值运算符的结合性是从右至左。
笔记
特殊的赋值:连续赋值语句
连续赋值语句
连续赋值语句逻辑步骤

3.4.10. 复合赋值运算符

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

3.4.11. 赋值表达式

赋值表达式

3.4.12. 逗号运算符和逗号表达式

逗号运算符又称为顺序求值运算符,它是双目运算符,运算对象是表达式,
常用于for循环语句中。
逗号运算符
赋值表达式和逗号表达式
赋值表达式使用
赋值表达式使用
逗号运算符的优先级:
1、任何运算符优先于逗号运算符,即逗号运算符的优先级最低。
2、逗号运算符的结合性是从左至右。
笔记
需要注意的是,并不是任何地方出现的逗号都是逗号运算符。
很多情况下,逗号仅用作分隔符。
用逗号运算符把两个或多个表达式连接起来构成逗号表达式,构成规则:表达式1,表达式2
其中,表达式可以是算术表达式、关系表达式、逻辑表达式、条件表达式、赋值表达式和逗号表达式等。

3.4.13. 条件运算符和条件表达式

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

整型变量的原码,反码,补码和取绝对值

3.4.14. 位逻辑运算符

位逻辑运算符将数据中的每个二进制位上的“0”或“1”作为逻辑值,按位进行逻辑运算。位逻辑运算符分为按位非、按位与、按位或和按位异或(又称按位加)四种,其中按位非是单目运算符,其余三种都是双目运算符。
位逻辑运算符
1、运算对象只能是整型或字符型数据。除按位非为单目运算符外,其余均为双目运算符。
2、参与位逻辑运算时,运算对象以二进制形式进行相应的按位运算。位逻辑运算符的优先级; 1、~优先于双目算术运算符优先于关系运算符优先于&优先于^优先于|优先于双目逻辑运算符。
2、~与单目逻辑运算符、自增、自减、单目算术运算符、长度运算符的优先级相同,结合性是从右至左。

3.4.15. 位移位运算符

位移位运算符是将数据作为二进制数,进行向左或向右移动若干位的运算,分为左移和右移两种,均为双目运算符,其中第一个运算对象的移位对象,第二个运算对象是移动的二进制位数。
1、运算对象只能是整型或字符型数据。
2、参与位移位运算时,运算对象以二进制形式进行相应的按位运算。
位移位运算符的说明
位移位运算符的优先级:
1、算术运算符 优先于位移位运算符优先于关系运算符。
2、位移位运算符的优先级相同,结合性是从左至右。
unsigned int b=248;
b=b>>2 运算后的值是62
int x=4,y=2; 表达式(x>>y)+(x<<y)的值是 17

3.4.16. 长度运算符

长度运算符是单目运算符,其运算对象可以是任何数据类型符或变量。
长度运算符的使用形式:sizeof(数据类型符)或sizeof(变量)
长度运算符的说明
长度运算符的优先级:
1、与单目算术运算符、单目逻辑运算符、自增和自减运算符的优先级相同。
2、上述优先级相同的运算符的结合性都是从右至左。
sizeof(int) 4
sizeof(float) 4
sizeof(double) 8

3.5. 数据类型转换

自动类型转换:
参与运算的各个数据都转换成数据较长的数据类型,然后计算,结果的类型就是数据长度较长的数据类型。本质上是较低类型的转换,即“就高不就低”或“就长不就短”的原则。
自动类型转换的条件环境和规则
自动类型转换的底层逻辑

3.5.1. 赋值类型转换

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

3.5.2. 强制类型转换

除了自动类型转换和赋值类型转换外,C语言也允许强制类型转换
格式:数据类型强制转换的一般格式:(数据类型符)(表达式)
C语言首先按照自动类型转换原则计算表达式的值,然后将其转换为指定的数据类型。需要注意的是,若表达式仅仅是单个常量或变量时,外面的一对圆括号可以省略;若是含有运算符的表达式,则必须用一对圆括号括起来。
int a ; float b = 1.9 ; 执行语句 a=(int)b后变量a和b的值分别是 1, 1.9
强制类型转换
进行数据类型转换时,需要注意以下几点:
1、强制类型转换获得的是一个所需类型的中间量,原来表达式的类型并不发生变化。
2、表达式计算过程中,参与运算的常量或变量的类型自动转换是临时的,它仅产生一个临时的、类型不同的数据参与运算,常量或变量的原类型和值均不改变。
3、运算结果赋予变量的类型转换过程中,无论是自动变量的还是强制的,当数据长度较长的结果存入数据长度较短的变量时,将截去超出的部分,有可能造成错误。
4、数据类型转换将占用系统时间,过多的转换将降低程序的运行效率,所以除了必要的数据类型转换外,应尽量选择好数据类型,避免不必要的转换。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

川月向南

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值