C语言程序设计知识部分
二、运算符与表达式
1. C语言常用运算符
(1)C语言运算符表
运算符 | 符号解释 | 结合性 |
---|---|---|
() [] ~ | 括号(函数等),数组,取反运算 | 由左向右 |
! & (类型) sizeof | 否定,取地址,类型转换,求大小 | 由右向左 |
* / % | 乘,除,取模 | 由左向右 |
+ - | 加,减 | 由左向右 |
<< >> | 左移,右移 | 由左向右 |
< <= >= > | 小于,小于等于,大于等于,大于 | 由左向右 |
== != | 等于,不等于 | 由左向右 |
& | 按位与 | 由左向右 |
^ | 按位异或 | 由左向右 |
(2)强制类型转换运算符
通过强制类型转换运算符可以将一个表达式转换成所需类型。一般形式:(类型名)(表达式)
(3)逗号运算符和逗号表达式
-
逗号表达式:用逗号运算符将几个表达式连接起来。
-
一般形式:表达式1,表达式2,… ,表达式n
-
求解过程:从左到右依次求解表达式,最终表达式n的值为逗号表达式的值。
2.算数运算符和算数表达式
(1)基本算数运算符
-
分类: + (加)、 - (减) 、 * (乘) 、 / (除) 和 % (求余)
-
优先级:*、/ 和%同级,+和-同级,但乘除优先级最高。即先乘除后加减。
-
注:1. %运算的两端必须是整型,其余运算对象都可以是整型或实型
2.双目运算符两边的数值类型必须一致才能运算,如果不一致,系统需先进行一致性转换。转换规则:char -> short -> int -> unsigned -> long -> float -> double 。
3.所以实数运算都是以双精度方式进行,若是单精度数值,则需要在尾数后补0转换为双精度数值。
补充:单目运算符:只有一个操作数,如:! ~ ++ -- - * & sizeof
双目运算符:有两个操作数,如:, + - * / = ==
三目运算符:需要三个操作数,如:?:
(2)算数表达式
定义:用算数运算符和括号将运算量连接起来的、符合C语言语法规则的表达式。
运算对象:函数、常量和变量等。
运算规则:
-
由内而外先计算括号内的表达式。
-
对不同的优先级的运算符,按运算符优先级的高低进行运算。
-
若运算符两侧的操作数类型不同,先用自动转换或强制类型转换,然后进行运算。
(3)自加自减运算符
- 自加运算符:++ 使运算变量的值增1
- 自减运算符: – 使运算变量的值减1
自加自减运算符均可作为前缀运算符,也可作为后缀运算符构成一个表达式。
- ++i,–i :在使用i之前,先使i的值加1或者减1,再使用次数表达式的值参加运算。
- i++,i-- :i的值先参与表达式的运算,再执行自增1或者自减1。
3.赋值运算符和赋值表达式
(1)基本的赋值运算符与赋值表达式
- “=”是赋值运算符,作用是将一个数值赋给一个变量或者将一个变量的值赋给另一个变量,而由赋值运算符组成的表达式是赋值表达式。
- 一般形式:变量名 = 表达式
- 赋值运算符的左侧只能是变量,不能是常量或表达式。右侧可以是表达式,包括赋值表达式。
- 最左侧的变量所得到的新值就是整个赋值表达式的值。
(2)复合的赋值运算符
在赋值运算符之前加上其他运算符可以构成复合赋值运算符。如,+=,-=,*=,/=,%=等。
- 两个符合之间不能有空格。
- 复合赋值运算符的优先级与赋值运算符的相同。
(3)赋值运算中的类型转换
如果赋值运算符两侧的类型不一致,在赋值前系统将自动先把右侧表达式求得的数值按赋值号左边变量的类型进行转换,也可使用强制转换符进行类型转换。
4.位运算
C语言提供了6种位运算符,其中布尔运算符4种,移位运算符2种。
(1)布尔运算符
运算符 | 意义 | 举例 | 结果 |
---|---|---|---|
& | 按位与 | x&y | 如果 x 和 y 都为 1,则 x&y 结果为 1;如果 x 或 y 任何一个为 0,或两个都为0,则 x&y 结果为 0 |
| | 按位或 | x|y | 如果 x 或 y 为 1,或两个都为 1,则x|y 结果为 1;如果 x 和 y 都为 0,则x|y结果为 0 |
^ | 按位异或 | x^y | 如果 x 或 y 的值不同,则 x^y 结果为 1;如果两个值相同,则 x^y 结果为 0 |
~ | 按位求反 | ~x | 如果 x 为 0,则 ~x 结果为 1,如果 x 是 1,则~x 结果为 0 |
(2)移位运算符
运算符 | 意义 | 举例 | 结果 |
---|---|---|---|
<< | 向左移位 | x<<y | x 的每个位向左移动 y 个位 |
>> | 向右移位 | x>>y | x 的每个位向右移动 y 个位 |
- 注:位运算中除 ~ 外,其余运算符都为双目运算符,要求两侧各有一个运算量。且运算量只能是整型或字符型数据,不能为实型数据。