【C-Primer-Plus读书笔记】第5章:运算符、表达式和语句
基本运算符
赋值运算符:
=
=
并不意味(数学中的)相等,而是一个赋值运算符。几个术语:数据对象、左值、右值和运算符
- 左值必须是一个变量名,不能给常量赋值,即可修改的左值。
- 赋值表达式语句的目的是把值存储到内存位置上。用于存储值的数据存储区域统称为数据对象。
- 左值用于标识特定数据对象的名称或表达式。因此,对象指的是实际的数据存储,而左值是用于标识或定位存储位置的标签。
- 右值指的是能赋值给可修改左值的量,且本身不是左值。
加法运算符:
+
- 加法运算符用于加法运算,使其两侧的值相加。
加法运算符:
-
- 减法运算符用于减法运算,使其左侧的数减去右侧的数。
+
和-
都称为二元运算符,即这些运算符需要两个运算对象才能完成操作。符号运算符:
-
和+
- 减号和加号还可以用于标明或改变一个值的代数符号。即正负号,以这种方式使用的正负号被称为一元运算符,一元运算符只有一个运算对象。
乘法运算符:
*
- 符号
*
表示乘法。C没有平方函数,可以使用乘法来计算平方。 - 乘法的应用:指数增长
- 符号
乘法运算符:
/
- C使用符号
/
来表示除法。左侧的值是被除数,右侧的值是除数。 - 整数除法与浮点数除法不同。浮点数除法的结果是浮点数,而整数除法的结果是整数,在C中整数除法结果的小数部分被丢弃(不会四舍五入),这一过程被称为截断。
- 混合整数和浮点数计算的结果是浮点数。编译器会把两个运算对象转换成相同类型,从较小类型转换为较大类型。
- C使用符号
运算符优先级
- 如下表(从低至高)
运算符 | 结合律 |
---|---|
() | 从左往右 |
+ - (一元) | 从右往左 |
* / | 从左往右 |
+ - (二元) | 从左往右 |
= | 从右往左 |
优先级和求值顺序
- 当运算符共享一个运算对象时,优先级决定了求值顺序。
其他运算符
sizeof
运算符和size_t
类型sizeof
运算符以字节为单位返回运算对象的大小。size_t
类型是一个无符号整数类型,但它不是新类型。size_t
是语言定义的标准类型,借助C的typedef
机制为现有类型创建的别名。sizeof
运算符和size_t
类型的关系:C语言规定,sizeof
返回size_t
类型的值。
求模运算符:
%
- 求模运算符用于整数运算。求模运算符给出其左侧整数除以右侧整数的余数。
- 求模运算符经常用于控制程序流。
- 负数求模,C99规定“趋零截断”,如果第1个运算对象是负数,那么求模结果就为负数,反之为正数。
递增运算符:
++
- 递增运算符执行简单的任务,将其运算对象递增1。
该运算符有两种方式:
++
出现在其作用的变量前面,这是前缀模式;返回递增之前的值,然后实际递增该变量。--
出现在其作用的变量后面,这是后缀模式;返回递增之后的值,返回结果之前已经递增该变量。
递减运算符:
--
- 递减运算符:每种形式的递增运算符都有一个递减运算符与之对应,用
--
代替++
即可。
- 递减运算符:每种形式的递增运算符都有一个递减运算符与之对应,用
优先级
- 递增运算符和递减运算符都有很高的优先级,只有圆括号的优先级比它们高。
- 递增运算符和递减运算符只能影响一个变量(即可修改的左值)。
表达式和语句
表达式
- 表达式由运算符和运算对象组成。一些表达式由子表达式(即较小的表达式)组成。
- 每一个表达式都有一只值
语句
- 语句是C程序的基本构建块。一条语句相当于一条完整的计算机指令。在C中大部分语句以分号结尾。
副作用和序列点:
- 副作用是对数据对象或文件的修改。赋值操作属于副作用。
- 序列点是程序执行的点,在该点上,所有的副作用都在进入下一步之前发生。在C中,语句中的分号标记了一个序列点。
复合语句(块)
- 复合语句是用花括号括起来的一条或多条语句,复合语句也称为块。
类型转换
基本的类型转换规则如下:
- 当类型转换出现在表达式时,都是从较小类型转换为较大类型,所以这些转换也被称为升级。
- 涉及两种类型的运算,两个值会被分别转换成两种类型的更高级别。
- 类型的级别从高至低依次是:
long double
、double
、float
、unsigned long long
、long long
、unsigned long
、long
、unsigned int
、int
。例外情况是,当long
和int
大小相同时,unsigned int
比long
的级别高。 - 在赋值表达式语句中,计算的最终结果会被转换成被赋值变量的类型。这个过程可能导致类型升级或降级(降级指把一种类型转换成更低级别的类型)。
- 当作为函数参数传递时,
char
和short
被转换成int
,float
被转换成double
。
类型升级通常都不会有什么问题,但是类型降级会导致真正的麻烦。
强制类型转换运算符
强制类型转换即在某个量的前面放置圆括号括起来的类型名,该类型名即是希望转换成的目标类型。圆括号和它括起来的类型名构成了强制类型转换运算符。PS : (type)
带参数的函数
- 形参(形式参数),声明参数就创建了被称为形式参数的变量。
- 实参(实际参数),函数调用传递的值为实际参数。
- 变量名是函数私有的,即在函数中定义的变量名不会和别处相同名称发生冲突。
- 原型,即是函数的声明,描述了函数的返回值和参数。