3.6 KiB
C 语言中的赋值运算符
原文:https://overiq.com/c-programming-101/assignment-operator-in-c/
最后更新于 2020 年 7 月 27 日
我们之前已经多次使用赋值运算符(=)。我们在这里详细讨论一下。赋值运算符(=)用于给变量赋值。其一般格式如下:
variable = right_side
赋值运算符左侧的操作数必须是变量,右侧的操作数必须是常量、变量或表达式。以下是一些例子:
x = 18 // right operand is a constant
y = x // right operand is a variable
z = 1 * 12 + x // right operand is an expression
赋值运算符的优先级低于我们到目前为止讨论的所有运算符,它从右向左关联。
我们也可以同时给多个变量赋值。
x = y = z = 100
这里x、y、z初始化为100。
因为赋值运算符(=)的关联性是从右向左的。上述表达式相当于以下内容:
x = (y = (z = 100))
请注意,表达式如下:
x = 18
y = x
z = 1 * 12 + x
被称为赋值表达式。如果我们在表达式的末尾放一个分号(;)如下:
x = 18;
y = x;
z = 1 * 12 + x;
那么赋值表达式就变成了赋值语句。
复合赋值运算符
使用变量的旧值来计算其新值的赋值操作称为复合赋值。
考虑以下两种说法:
x = 100;
x = x + 5;
这里第二个语句将5添加到x的现有值中。该值随后被分配回x。现在,x的新价值是105。
为了更简洁地处理这些操作,C 语言提供了一种特殊的操作符,称为复合赋值操作符。
复合赋值运算符的一般格式如下:
variable op= expression
其中op可以是任意算术运算符(+、-、*、/、%)。上述语句在功能上等同于以下内容:
variable = variable op (expression)
注:除了算术运算符,op还可以是>>(右移)、<<(左移)、|(按位 OR)、&(按位 AND)、^(按位异或)。我们还没有讨论这些操作符。
计算表达式后,op运算符应用于表达式的结果和变量的当前值(在 RHS 上)。这个操作的结果然后被分配回变量(在 LHS 上)。让我们举一些例子:声明:
x += 5;
相当于x = x + 5;或x = x + (5);。
同样,该声明:
x *= 2;
相当于x = x * 2;或x = x * (2);。
由于op运算符右侧的expression首先被求值,因此语句:
x *= y + 1;
相当于x = x * (y + 1)。
复合赋值运算符的优先级相同,它们从右向左关联(参见优先级表)。
下表列出了一些复合赋值运算符:
| 操作员 | 描述 |
|---|---|
+= |
x += 5相当于x = x + 5 |
-= |
y -= 5相当于y = y - 5 |
/= |
z /= 3相当于z = z / 5 |
%= |
m %= 10相当于m = m % 10 |
以下程序演示了复合赋值运算符的作用:
#include<stdio.h>
int main(void)
{
int i = 10;
char a = 'd';
printf("ASCII value of %c is %d\n", a, a); // print ASCII value of d
a += 10; // increment a by 10;
printf("ASCII value of %c is %d\n", a, a); // print ASCII value of n
a *= 5; // multiple a by 5;
printf("a = %d\n", a);
a /= 4; // divide a by 4;
printf("a = %d\n", a);
a %= 2; // remainder of a % 2;
printf("a = %d\n", a);
a *= a + i; // is equivalent to a = a * (a + i)
printf("a = %d\n", a);
return 0; // return 0 to operating system
}
预期输出:
ASCII value of d is 100
ASCII value of n is 110
a = 38
a = 9
a = 1
a = 11