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