第五章 运算符、表达式和语句——《C Primer Plus》笔
第五章 运算符、表达式和语句
5.1 循环简介
5.2 基本运算符
赋值运算符:=
数据对象:用于存储值的数据存储区域。
左值:用于标识特定数据对象的名称或表达式。
数据指实际的数据存储;左值指用于标识或定位存储位置的标签。
右值:能复制给可修改左值的量,且本身不是左值。(既不是某个存储位置的标签)
加法运算符:+
减法运算符:-
符号运算符:- 和 +
乘法运算符:*
除法运算符:/
运算符优先级(从低到高)
运算符 | 结合律 |
---|---|
() | 从左往右 |
+ -(一元) | 从右往左 |
* / | 从左往右 |
+ -(二元) | 从左往右 |
= | 从右往左 |
5.3 其他运算符
sizeof 运算符
运算对象可以是具体的数据对象(如,变量名)或类型。如果运算对象是类型(如,float
),则必须用圆括号将其括起来。
求模运算符:%
递增运算符:++
有前缀,后缀形式。
递减运算符:--
5.4 表达式和语句
表达式:由运算符和运算对象组成,每个表达式都有一个值。如:
4
-6
a*(b + c/d)/20
语句:C 程序的基本构建块。一条语句相当于一条完整的计算机指令。大部分语句都以分号结尾。
- 赋值表达式语句
- 函数表达式语句
- 迭代(结构化)语句
- 空语句
- 复合(块)语句
注:声明不是表达式语句。
5.5 类型转换
当数据类型不匹配时就会发生类型转换。
-
当类型转换出现在表达式时,无论是
unsigned
还是signed
的char
和short
都会被自动转换成int
,如有必要会被转换成unsigned int
(如果short
与int
的大小相同,unsigned short
就比int
大。这种情况下,unsigned short
会被转换成unsigned int
)。由于都是从较小类型转换为较大类型,所以这些转换被称为升级(promotion
)。 -
涉及两种类型的运算,两个值会被分别转换成两种类型的更高级别。
-
类型的级别从高至低依次是
long double
、double
、float
、unsigned long long
、long long
unsigned long
、long
、unsigned int
、int
。例外的情况是,当long
和int
的大小相同时,unsigned int
比long
的级别高。之所以short
和char
类型没有列出,是因为它们己经被升级到int
或unsigned int
。 -
在赋值表达式语句中,计算的最终结果会被转换成被赋值变量的类型。这个过程可能导致类型升级或降级(
demotion
)。所谓降级,是指把一种类型转换成更低级别的类型。 -
当作为函数参数传递时,
char
和short
被转换成int
,float
转换成double
。第9
章将介绍,函数原型会覆盖自动升级。
类型降级规则如下:
-
目标类型是无符号整型,且待赋的值是整数时,额外的位将被忽略。例如,如果目标类型是
8
位unsigned char
,待赋的值是原始值求模256
。 -
如果目标类型是一个有符号整型,且待赋的值是整数,结果因实现而异。
-
如果目标类型是一个整型,且待赋的值是浮点数,该行为是未定义的。
5.6 带参数的函数
形参:函数声明的参数。
实参:实际传递的参数。