一、基本概念
1)数据对象:用于存储值的数据存储区域的统称。
C标准只有在提到上述概念时,才会用到对象这个术语
使用变量名是标识对象的一种方法
2)左值:用于标识特定数据对象的名称或表达式
3)对象指的是实际的数据存储,左值是用于标识或定位存储位置的标签
4)对于早期的C语言,提到左值意味着:
(1)它指定一个对象,所以引用内存中的地址
(2)它可以用在赋值运算符的左侧
5)可修改的左值:用于标识可修改的对象。
由于出现了const限定符,被const修饰的变量不可修改,所以现在放在赋值运算符左侧的应该是可修改的左值,当前标准建议,使用术语对象定位值
6)右值:能赋值给可修改的左值的量,且本身不是左值。当前标准在描述这一概念时使用的是表达式的值
7)运算对象:运算符操作的对象
二、算术运算符
加+、减-、乘*、除/、求模%、自增++、自减--
1)整数除法和浮点数除法不同。
浮点数除法的结果是浮点数。
整数除法的结果是整数。如果计算结果有小数部分,会被丢弃,这一过程被称为趋零截断
2)求模运算符只能用于整数
如果求模运算符的第一个运算对象是负数,那么结果为负;如果第一个运算对象是正数,结果为正
3)递增、递减运算符
前缀形式:++a或--a,先递增/递减a,然后再使用a的值
后缀形式:b++或b--,先使用b的值,然后再递增/递减b
三、表达式和语句
1)表达式由运算符和运算对象组成
C语言表达式的一个最重要的特性:每个表达式都有一个值
有赋值运算符的表达式的值与赋值运算符左侧变量的值相同,例如,q = 5 * 2,这个表达式的值是10
2)语句:是C程序的基本构建块。一条语句相当于一条完整的计算机指令。
在C语言中,大部分语句都以分号结尾
注意:根据C标准,声明不是语句!!
在C语言中,赋值和函数调用都属于表达式语句
四、副作用和序列点
1)副作用是对数据对象或文件的修改
2)序列点是程序执行的点,在该点上,所有的副作用都在进入下一步之前发生
五、类型砖换
1)当类型砖换出现在表达式时,无论是unsigned还是signed的char、short都会被转换成int,如果有必要,会被转换成unsigned int。这种转换被称为升级
2)涉及两种类型的运算,两个值会被分别转换成两种类型的更高级别
3)在赋值表达式语句中,计算的最终结果会被转换成被赋值的变量的类型。这一过程可能会导致类型升级或降级
4)当作为函数参数传递时,char和short会被转换成int,float会被转换成double。函数原型会覆盖自动升级
5)如果待赋值的值与目标类型不匹配,规则如下
(1)目标类型时无符号整型,且待赋值的值是整数时,额外的位将被忽略。例如,如果目标类型是8位的unsigned char,那么待赋值的值将会对256求模,将结果赋给目标
(2)如果目标类型是一个有符号整型,且待赋的值是整数,结果取决于具体实现
(3)如果目标类型是一个整型,待赋的值是一个浮点型,该行为是未定义的。
6)强制类型转换运算符:(type)
六、带参数的函数
1)声明参数就创建了被称为形式参数的变量
2)函数调用时传递的值被称为实际参数
3)变量名是函数私有的,即在函数中定义的变量名不会和别处的相同名称发生冲突