006【第二章·基本数据类型】第五节:变量的赋值和赋值运算符

时间:2024-10-16 07:23:41

目录

赋值运算符的定义和使用

赋值运算符与数学等号的区别

运算符的优先级和结合性


赋值运算符的定义和使用

        赋值运算符 (=) 用于给变量赋值。由赋值运算符(Assignment Operator)及其两侧的操作数 (Operand) 组成的表达式称为赋值表达式 (Assignment Expression)

        C 语言没有提供专门的赋值语句。赋值操作是通过在赋值表达式后面加分号构成表达式语句来实现的。例如,赋值表达式 x = 1 表示给变量 x 赋值为 1,在其后加分号就构成了赋值表达式语句,即:

x = 1;

赋值运算符与数学等号的区别

        虽然在书写形式上赋值运算符与数学中的等号相同,但两者的含义在本质上是不同的。赋值运算符的含义是将赋值运算符右侧表达式的值(简称为右值)赋给左侧的变量,即在 C 语言中赋值运算的操作是有方向性的,并无 “等号两侧操作数的值相等” 之意。因此,等号左侧只能是标识一个特定存储单元的变量名

        注意,像 a + b = c 这样在数学上有意义的等式在 C 语言中是不合法的语句,而在数学中无意义(无解)的等式 x = x + 1,在 C 语言中却是合法的语句。该语句的含义是 “取出 x 的值加 1 后再存入 x”。例如,如果在前面已经为 x 赋值为 1,再执行 x = x + 1 后,x 的值就变成 2 了。也就是说,在赋值表达式 x = x + 1 中,赋值运算符左侧的变量 x 与右侧的变量 x 的值具有不同的含义。右侧的 x 代表赋值操作之前 x 的值,实际对 x 进行的是 “” 操作,而左侧的 x 代表赋值操作之后 x 的值,实际对 x 进行的是 “” 操作


运算符的优先级和结合性

        在计算含有不同类型运算符的表达式时,要考虑运算符的优先级 (Precedence),根据优先级确定运算的顺序,即先执行优先级高的运算,然后再执行优先级低的运算。由于赋值表达式 x = x + 1 中右值是一个算术表达式,而算术运算符的优先级高于赋值运算符的优先级,因此 x = x + 1 的计算过程是 “先计算 x + 1 的值,然后再将 x + 1 的值赋值给 x”。

        在 C 语言中,赋值表达式的值被规定为运算完成后左操作数的值,类型与左操作数相同,因此,赋值表达式 x = x + 1 的值为左侧变量 x 的值。

        如果表达式中的运算符的优先级相同,应该先算哪一个呢?这时需要考虑运算符的结合性 (Associativity),根据运算符的结合性来确定运算的顺序。运算符的结合性有两种:

  • 一种是左结合,即自左向右计算
  • 另一种是右结合,即自右向左计算

        C 语言中需要两个操作数的算术运算符是左结合的。例如,计算算术表达式 x / y * z 时,相当于计算算术表达式 (x / y) * z,而非 x / (y * z),即从左向右先计算 x / y 的值,然后再将 x / y 的值与 z 的值相乘。而赋值运算符则是右结合的。例如,下面两条语句是等价的:

a = b = c = 0;
a = (b = (c = 0));

        执行时是从右向左把最右侧的表达式的值依次赋值给左侧的变量。像上面这种形式的赋值表达式称为多重赋值 (Multiple Assignment) 表达式,一般用于为多个变量赋予相同的数值。