从头学C(21)赋值运算符与表达式

0

第二章 类型、运算符与表达式 >> 2.10 赋值运算符与表达式

赋值运算符,最简单也是最重要的运算符,要想对变量进行赋值,可离不开这个小东西。

不过,要知道赋值运算符可不是仅仅只有等于号“=”这么一个孤家寡人,它还有很多其他的“兄弟”,比如:

+=  -=  *=  /=  %=  <<=  >>=  &=  ^=  |=

以上这些也都是赋值运算符。它们的形式都是“op=”,op代表对应的二元运算符,如+  –  *  /等。

如果expr1和expr2是表达式,那么

expr1 op= expr2;
比如: i += 2;

等价于:

expr1 = (expr1) op (expr2);
比如: i = i + 2;

它们的区别在于,前一种形式expr1只计算一次。

要注意的是第二种形式的圆括号必不可少,因为:

x *= y + 1;

等价于:

x = x * (y + 1);

而不是:

x = x * y + 1;

下面看一个统计整形参数的值中二进制位为1的个数的例子:

/* bitcount: count 1 bits in x */
int bitcount(unsigned x)
{
    int b;

    for(b = 0; x != 0; x >>= 1)
        if(x & 0x01)
            b++;
    return b;
}

其中x声明为无符号类型,是为了保证在将x进行右移运算时,无论在什么机器上运行,左边空出来的位都是用0(而不是符号位)填充。

这种形如“op=”的赋值运算符,其优点是显著的:

  1. 符合人类的思维习惯;
  2. 使代码更易于理解;
  3. 有助于编译器产生高效代码。

最后要注意,赋值语句是具有值的,可用于表达式中。之前我们已经看到了:

while((c = getchar()) != EOF)

在对c进行赋值之后,便可直接对赋值语句的值进行判断。当然其他赋值运算符(如+=、-=)也可以用在表达式中,虽然这种用法比较少见。

赋值表达式的值是赋值操作完成后的值,其类型是它的左操作数的类型。

Leave A Reply