2.10 赋值运算符与表达式
在赋值表达式中,如果表达式左边的变量重复出现在表达式的右边,如 i = i + 2
则可以将这种表达式缩写为 i += 2
,其中的运算符 +=
称为赋值运算符
大多数二元运算符(即有左、右两个操作数的运算符,比如 +
)都有一个相应的赋值运算符 op=
其中,op
可以是下面这些运算符之一:+
、-
、*
、/
、%
、<<
、>>
、&
、^
、|
如果 expr1
和 expr2
是表达式,那么 expr1 op= expr2
等价于:expr1 = (expr1) op (expr2)
它们的区别在于,前一种形式 expr1
只计算一次
注意,在第二种形式中,expr2
两边的圆括号是必不可少的
例如 x *= y + 1
的含义是 x = x * (y + 1)
,而不是 x = x * y + 1
举例说明:函数 bitcount
统计整型参数中为 1
的二进制位的个数
/* bitcount: count 1 bits in x */
int bitcount(unsigned x)
{
int b;
for (b = 0; x != 0; x >>= 1)
if (x & 01)
b++;
return b;
}
这里将 x
声明为无符号类型是为了保证将 x
右移时,无论该程序在什么机器上运行,左边空出的位都用 0
(而不是符号位)填补
除了简洁外,赋值运算符还有一个优点:表示方式与人们的思维习惯比较接近
我们通常会说 “ 把 2
加到 i
上 ” 或 “ 把 i
增加 2
”
而不会说 “ 取 i
的值,加上 2
,再把结果放回到 i
中 ”
因此,表达式 i += 2
比 i = i + 2
更自然
另外,对于复杂的表达式,如:
yyval[yypv[p3+p4] + yypv[p1+p2]] += 2
赋值运算符使程序代码更易于理解,代码的阅读者不必煞费苦心地去检查两个长表达式是否完全一样
也无须为两者为什么不一样而疑惑不解,并且,赋值运算符还有助于编译器产生高效代码
从上述例子中我们可以看出,赋值语句具有值,且可以用在表达式中
下面是最常见的一个例子:
while ((c = getchar()) != EOF)
其它赋值运算符(如 +=
、-=
等)也可以用在表达式中,尽管这种用法比较少见
在所有的这类表达式中,赋值表达式的类型是它的左操作数的类型,其值是赋值操作完成后的值