赋值运算符
运算符 | 术语 | 示例 | 结果 |
---|---|---|---|
= | 赋值 | 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; |
我们常常会将表达式的值保存到变量中,以便将来使用。赋值运算符就是用于此目的的。
表达式的主要作用是计算出一个结果,如果想要将这个结果保存下来,以便接下来使用,就需要用到赋值运算符了。
下面,我们将赋值运算符分为两类,来详细讲解赋值运算符:
- 简单赋值运算符。也就是
=
, - 复合赋值运算符。包含
+=, -=, *=, %=
等一系列复合赋值运算符。
简单赋值
在C语言中,简单赋值操作符 =
是最基本的赋值运算符,用于将右侧表达式的值赋给左侧的变量。这种操作是C语言中最常见的操作之一,几乎出现在每个程序中。
=
赋值运算符组成的赋值表达式也具有两个作用,即主要作用和副作用。
- 主要作用:表达式的主要作用是计算值,赋值表达式也不例外。但赋值表达式的值比较特殊,它计算出来的值就是那个要赋给变量的值,一般就是赋值表达式的右值。
- 副作用:对于赋值表达式,我们实际上更关注它的副作用。赋值表达式的副作用就是会改变表达式左边变量的取值。
表达式 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);
不过,我们一般很少这样用。
复合赋值运算符组成的表达式同样存在主要作用和副作用,但一般它主要作用我们很少去使用,更多的还是关注它的副作用,即给变量赋值的作用。