Skip to content

赋值运算符

运算符术语示例结果
=赋值a=2; b=3;a=2; b=3;
+=加等于a=0; a+=2;a=2;
-=减等于a=5; a-=3;a=2;
*=乘等于a=2; a*=2;a=4;
/=除等于a=4; a/=2;a=2;
%=模等于a=3; a%2;a=1;

我们常常会将表达式的值保存到变量中,以便将来使用。赋值运算符就是用于此目的的。


表达式的主要作用是计算出一个结果,如果想要将这个结果保存下来,以便接下来使用,就需要用到赋值运算符了。

下面,我们将赋值运算符分为两类,来详细讲解赋值运算符:

  1. 简单赋值运算符。也就是=
  2. 复合赋值运算符。包含+=, -=, *=, %=等一系列复合赋值运算符。

简单赋值

在C语言中,简单赋值操作符 = 是最基本的赋值运算符,用于将右侧表达式的值赋给左侧的变量。这种操作是C语言中最常见的操作之一,几乎出现在每个程序中。

=赋值运算符组成的赋值表达式也具有两个作用,即主要作用和副作用。

  1. 主要作用:表达式的主要作用是计算值,赋值表达式也不例外。但赋值表达式的值比较特殊,它计算出来的值就是那个要赋给变量的值,一般就是赋值表达式的右值。
  2. 副作用:对于赋值表达式,我们实际上更关注它的副作用。赋值表达式的副作用就是会改变表达式左边变量的取值。

表达式 v = e 的作用是:求出表达式 e 的值,并把这个值赋值给变量 v。如:

cpp
i = 5; /* i is now 5 */
j = i; /* j is now 5 */
k = 10 * i + j; /* k is now 55 */

如果 v 和 e 的类型不同,那么在赋值过程中会把 e 的值转换成 v 的类型:

cpp
int i;
float f;

i = 72.99f; /* i is now 72 */
f = 136; /* f is now 136.0 */

注意

赋值表达式 v = e 也有值,它的值等于赋值运算后 v 的值。

赋值运算符可以串联在一起,如:

cpp
i = j = k = 0;

由于赋值运算符是右结合的,上述表达式等价于:

cpp
i = (j = (k = 0));

小练习

cpp
int i;
float f;

f = i = 33.3f;

请问变量f的值是多少?

33.000000

复合赋值

利用变量原有的值去计算新的值,这在程序中是非常普遍的。例如:

cpp
i = i + 2;

C 语言的复合赋值运算符可以将上面的表达式简写为:

cpp
i += 2; /* same as i = i + 2 */

类似的还有:

cpp
i -= 2; /* same as i = i - 2 */
i *= 2; /* same as i = i * 2 */
i /= 2; /* same as i = i / 2 */
i %= 2; /* same as i = i % 2 */
...

复合赋值运算符也是右结合的,所以:

cpp
i += j += k;

等价于

cpp
i += (j += k);

不过,我们一般很少这样用。

复合赋值运算符组成的表达式同样存在主要作用和副作用,但一般它主要作用我们很少去使用,更多的还是关注它的副作用,即给变量赋值的作用。