赋值运算符及赋值表达式,C语言赋值运算符及其赋值表达式详解

赋值操作是程序设计中最常用的操作之一,C 语言共提供了 11 个赋值运算符,均为二元运算符,其中仅有一个为基本赋值运算符 =,其余 10 个均是复合赋值运算符,即:
  • 基本赋值运算符:=。
  • 复合赋值运算符:+=(加赋值)、-=(减赋值)、*=(乘赋值)、/=(除赋值)、%=(求余赋值)、 <<=(左移赋值)、>>=(右移赋值)、&=(按位与赋值)、|=(按位或赋值)、*A=(按位异或赋值)。

赋值操作的优先级较低,仅高于逗号运算符。

基本赋值 =

如 int a=5; 表示把 5 赋值给整型变量 a,不能读成 “a等于5”。赋值号左边必须为左值,赋值号右边的右值可以为常量、变量或表达式。如下赋值均是正确的。
int a,b; //定义整型变量a和b
a=3; //把常量3赋值给a,右值为常量
b=a; //把变量a的值赋给b,右值为变量
b=a+3; //把求和表达式a+3的值赋给b,右值为表达式
以下赋值均是错误的。
int a=2;
3=a; //错误,常量3不能作为左值
const int b=5; //定义整型常变量只读变量b,并初始化为5,其值不能被改变
b=1; //错误,企图改变常变量的值,即常变量不能作左值

复合赋值:+=、-=、*=、/=、%=

a+=b; 等价于 a=a+b;
a-=b; 等价于 a=a-b;
a*=b; 等价于 a=a*b;
a/=b; 等价于 a=a/b;

例如:
int a=5;
a+=3; //等价于 a=a+3;
由于赋值运算符的优先级很低,仅高于逗号运算符,故最后做赋值操作。

a+=3+2; 等价于 a=a+(3+2);

通过下面的例子,掌握上述 4 种复合赋值运算符。

【例 1】分析以下程序,输出其运行结果。
#include<stdio.h>
int main (void)
{
    int a=l,b=2,c=3; //定义三个整型变量,并初始化
    float d=10.2f; //定义float变量d,用浮点常量10.2初始化
    a+=1; //相当于 a=a+1;即 a=1+1=2
    b-=a+5;
    c*=a-4;
    printf ("%d,%d,%d,%f",a,b,c,d/=a);
    return 0;
}
代码分析:
1) float d=10.2f; 如果改为 float d=10.2; 虽然没有语法错误,可以正常运行,但一般编译器会提示 warning(警告),原因是编译器会把 10.2 等常量默认当成 double 型常量处理,与 d 的类型 float 不一致,故出现警告。因此可通过加 f 明确 10.2 为 float 型常量。

2) a+=1; 相当于 a=a+1; 求出 a 为 2。

3) b-=a+5; 由于赋值运算符的优先级低于算术求和运算符,故该语句等价于 b=b-(a+5);,即 b=2-(2+5);,得 b=-5;。同理,c*=a-4; 即 c=3*(2-4);,故 c=-60

4) printf("%d,%d,%d,%f",a,b,c,d/=a); 由于输出列表中 a、b 和 c 均为 int 型变量,故输出格式占位符均为 %d;输出列表中第 4 项为表达式,其表达式的值为 d=d/a=10.2f/2=5.1,为浮点类型,输出格式占位符为 %f,在 VC++ 6.0 环境中,float 类型为小数点后保留 6 位数字。

运行结果为:
2,-5,-6,5.100000