☀️光天化日学C语言☀️(20)- 赋值运算符 | 让代码变得更加简洁
【摘要】 让代码变得更加简洁
一、前言
本文作者是从 2007 年开始学 C语言 的,不久又接触了C++,基本就是 C/C++ 技术栈写了 14 年的样子,不算精通,但也算差强人意。著有《夜深人静写算法》系列,且承诺会持续更新,直到所有算法都学完。主要专攻 高中 OI 、大学 ACM、 职场 LeetCode 的全领域算法。由于文章中采用 C/C++ 的语法,于是就有不少读者朋友反馈语言层面就被劝退了,更何况是算法。
于是,2021 年 06 月 12 日,《光天化日学C语言》 应运而生。这个系列文章主要服务于高中生、大学生以及职场上想入坑C语言的志同道合之人,希望能给祖国引入更多编程方面的人才,并且让自己的青春不留遗憾!
这一章的主要内容是赋值运算符、赋值表达式。
二、人物简介
- 第一位登场的就是今后会一直教我们C语言的老师 —— 光天。
- 第二位登场的则是今后会和大家一起学习C语言的没什么资质的小白程序猿 —— 化日。
三、赋值运算符概览
1、赋值运算符
- 今天我们来讲一下赋值运算符。
- 对于赋值运算符,主要分为两类:简单赋值运算符 和 复合赋值运算符。如下图所示:
- 简单赋值运算符,我们之前在讲 光天化日学C语言(03)- 变量 的时候就已经遇到了,它的表示形式如下:$$\begin{aligned}变量 &= 常量 \ 变量 &= 表达式\end{aligned}$$
- 即将赋值符号
=
右边的操作数的值赋值给左边的操作数。
2、赋值表达式
- 类似这样的表达式,我们称之为 赋值表达式。
- 例如:
a = 10189;
a = a + 5;
- 任何表达式都是有值的,赋值表达式也不例外,它的值就是
=
右边的值。 - 试想一下这段代码的输出是多少?
#include <stdio.h>
int main() {
int a = 5;
int b = (a = 5);
printf("%d\n", b);
return 0;
}
- 运行结果为:
5
- 原因就是因为表达式
a = 5
的值为5
,从而等价于b = 5
。
3、赋值运算的自动类型转换
- 赋值运算符会进行自动类型转换,转换类型就是左边操作数的类型。
#include <stdio.h>
int main() {
int a = 0;
a = a + 1.5;
printf("%d\n", a);
return 0;
}
- 输出的结果为:
1
- 有关类型转换的内容,可以参考 光天化日学C语言(12)- 类型转换。
4、连续赋值
- 我们来看一个例子,如下:
#include <stdio.h>
int main() {
int a, b, c, d = 0;
a = b = c = d = d == 0;
printf("%d\n", a);
return 0;
}
- 这段代码的运行结果为:
1
- 为什么呢?
- 它其实等价于:
#include <stdio.h>
int main() {
int a, b, c, d = 0;
a = ( b = (c = ( d = (d == 0) ) ) );
printf("%d\n", a);
return 0;
}
- 这里涉及到两个概念:运算符优先级、运算符结合性。
- 具体的内容,我们会在后续内容中详细讲解。现在你只需要知道 赋值运算符
=
的优先级低于关系运算符==
,所以d = d == 0
等价于d = (d == 0)
;而赋值运算符=
的结合性是从右到左,所以a = b = c
等价于a = (b = c)
。
四、复合赋值运算符
- 首先来看一个赋值语句,如下:
int love;
love = love + 1314;
- 像这种表达式左边的变量重复出现在表达式的右边,则可以缩写成:
int love;
love += 1314;
- 而这里的
+=
就是复合赋值运算符,类似的复合赋值运算符还有很多,总共分为两大类:算术赋值运算符、位赋值运算符。
1、算术赋值运算符
- 算术运算符我们之前已经了解过了,具体可以参考这篇文章:光天化日学C语言(09)- 算术运算符。
- 而算术赋值运算符就是先进行算术运算,再进行赋值。算术赋值运算符的表格如下:
运算符 | 简称 | 描述 | 举例 |
---|---|---|---|
+= |
加且赋值运算符 | 将 右边操作数 加上 左边操作数 的结果赋值给 左边操作数 | a += b 等价于a = a + b |
-= |
减且赋值运算符 | 将 左边操作数 减去 右边操作数 的结果赋值给 左边操作数 | a -= b 等价于a = a - b |
*= |
乘且赋值运算符 | 将 右边操作数 乘以 左边操作数 的结果赋值给 左边操作数 | a *= b 等价于a = a * b |
/= |
除且赋值运算符 | 将 左边操作数 除以 右边操作数 的结果赋值给 左边操作数 | a /= b 等价于a = a / b |
%= |
求模且赋值运算符 | 求 两个操作数的模,并将结果赋值给 左边操作数 | a %= b 等价于a = a % b |
2、位赋值运算符
- 位运算符我们之前已经了解过了,具体可以参考这篇文章:光天化日学C语言(13)- 位运算概览。
- 而位赋值运算符就是先进行位运算,再进行赋值。位赋值运算符的表格如下:
运算符 | 简称 | 描述 | 举例 |
---|---|---|---|
&= |
按位与且赋值运算符 | 将 左边操作数 按位与上 右边操作数 的结果赋值给 左边操作数 | a &= b 等同于a = a & b |
|= |
按位或且赋值运算符 | 将 左边操作数 按位或上 右边操作数 的结果赋值给 左边操作数 | a |= b 等同于a = a | b |
^= |
按位异或且赋值运算符 | 将 左边操作数 按位异或上 右边操作数 的结果赋值给 左边操作数 | a ^= b 等同于a = a ^ b |
<<= |
左移且赋值运算符 | 将 左边操作数 左移 右边操作数 的位数后的结果赋值给 左边操作数 | a <<= b 等同于a = a << b |
>>= |
右移且赋值运算符 | 将 左边操作数 右移 右边操作数 的位数后的结果赋值给 左边操作数 | a >>= b 等同于a = a >> b |
五、复合赋值表达式
- 对于两个表达式 和 ,有复合赋值表达式:
-
- 等价于:
-
- 其中 就是上文提到的那 10 个 复合赋值运算符。
这样写的好处有三个:
1)前一种形式, 只计算一次;第二种形式要计算两次。
2)前一种形式,不需要加上圆括号;第二种形式的圆括号不可少。
3)看起来简洁清晰;
- 举个极端的例子:
a.b.c.d.e.f[ 1024 + g.h.i.j.k.l ] = a.b.c.d.e.f[ 1024 + g.h.i.j.k.l ] + 5
炸裂的🤣🤣🤣!!! - 利用复合赋值表达式,我们就可以写成:
a.b.c.d.e.f[ 1024 + g.h.i.j.k.l ] += 5
(当然,这个例子比较极端,实际编码中千万不要写出这样的代码哦)。
通过这一章,我们学会了:
1)赋值运算符;
2)赋值表达式;
- 希望对你有帮助哦 ~ 祝大家早日成为 C 语言大神!
课后习题
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)