赋值运算符和赋值表达式是程序中最常用的程序结构,C语言规定,任何变量都要先定义后使用,并且在引用前一定要进行赋值操作,而此时就需要用到赋值运算符“=”。
1. 简单赋值表达式
C语言中,赋值运算符以“=”表示。这里需要注意,“=”并不表示等于,而表示将某个值赋给变量,例如i = 5 和a = b+10,分别表示将常量 5 赋给变量i,将表达式b+10 的值赋给变量a。
赋值运算符是一个二元(双目)运算符,必须有两个对象参与操作。赋值号左边的对象叫做左值(l-value),赋值号左边只能是变量,常量或表达式不可以作为赋值表达式的左值。例如下面的表达均是错误的:
赋值运算符右端的对象叫做右值(r-value),右值可以是常量、变量,也可以是任何能够经过运算产生数值的表达式。可以将一个变量的值赋给另一个变量,例如a = b,但这样的赋值要求赋值号左右变量类型必须相同,或左边精度高于右边,否则将出现错误运行结果。
范例 3.2
LvalueAndRvalue.c
LvalueAndRvalue.c 将int型变量的值赋给short型变量,查看赋值后的结果。为表述方便,程序使用十六进制值 0x12345,接收变量为short型。
(光盘\chat3\ LvalueAndRvalue.c)
程序第 4 行定义了变量m并赋初值 0x12345,第 5 行定义了short型变量n并赋初值 0,程序第 6 行将m的值赋给n,由于n是short型变量,m是int型变量,所以n不能正确获取m的值。
程序运行输出结果为:
2. 连续赋值表达式
有时需要对几个变量赋予同一个值,这时可以使用连续赋值表达式,例如:
由于赋值运算符是右结合性,因此程序执行顺序为:
注意,在变量定义时不能进行连续赋值操作,如下的定义是错误的:
3. 复合赋值表达式
复合赋值表达式由赋值运算符、算术运算符或逻辑运算符以及操作对象构成,它将算术或逻辑运算与赋值结合在一起,例如表达式a += 10,它等价于a = a + 10。假如执行该表达式之前变量a的值为 5,则表达式的含义为将a的值 5 与 10 作加运算,并将和 15 重新赋给变量a,这样a的值将变为 15。有关这类复合赋值操作的原理请参看本章疑难解决。
C语言同样支持其他算术运算符和逻辑运算符的复合赋值操作,例如:
范例 3.3
DAssignmentOperator.c
DAssignmentOperator.c 使用复合赋值运算符进行算术和赋值操作。程序使用*=和+=分别对变量m和n作赋值运算,验证在同一表达式中两者之间的关系。
(光盘\chat3\ DAssignmentOperator.c)
程序第 6 行为复合赋值运算,变量m和n都被重新赋值。由于赋值运算符的右结合性,因此第 6 行展开为:
进一步展开为:
由于m最初被赋值为 10,n最初赋值为 5,因此执行m = m + 3 后,m变为 13,然后执行n = n*m,等价于n = 5*13,结果为 65,最后输出m和n的值分别为 13 和 65。
程序运行输出结果:
在工程应用中,应尽量避免使用这些简化的复合赋值运算符,原因有两点:一是编码时容易出错,二是不便于其他程序员阅读。有时这样的复合赋值表达式会产生二义性,即可能存在两种不同的解释方法,因此,编写程序时尽量使用简洁、易懂的程序代码。