❤️光天化日学C语言❤️(20)- 赋值运算符与赋值表达式 | 让代码变得更加简洁
Posted 英雄哪里出来
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了❤️光天化日学C语言❤️(20)- 赋值运算符与赋值表达式 | 让代码变得更加简洁相关的知识,希望对你有一定的参考价值。
🙉饭不食,水不饮,题必须刷🙉
还不会C语言,和我一起打卡! 🌞《光天化日学C语言》🌞
LeetCode 太难?上简单题! 🧡《C语言入门100例》🧡
LeetCode 太简单?大神盘他! 🌌《夜深人静写算法》🌌
一、前言
本文作者是从 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 |
五、复合赋值表达式
- 对于两个表达式 e 1 e_1 e1 和 e 2 e_2 e2,有复合赋值表达式:
- e 1 o p = e 2 e_1 \\ _{op=} \\ e_2 e1 op= e2
- 等价于:
- e 1 = ( e 1 ) o p ( e 2 ) e_1 = (e_1) \\ _{op} \\ (e_2) e1=(e1) op (e2)
- 其中 o p op op 就是上文提到的那 10 个 复合赋值运算符。
这样写的好处有三个:
1)前一种形式, e 1 e_1 e1 只计算一次;第二种形式要计算两次。
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 语言大神!
课后习题
📢博客主页:https://blog.csdn.net/WhereIsHeroFrom
📢欢迎各位 👍点赞 ⭐收藏 📝评论,如有错误请留言指正,非常感谢!
📢本文由 英雄哪里出来 原创,转载请注明出处,首发于 🙉 CSDN 🙉
作者的专栏:
👉C语言基础专栏《光天化日学C语言》
👉C语言基础配套试题详解《C语言入门100例》
👉算法进阶专栏《夜深人静写算法》
以上是关于❤️光天化日学C语言❤️(20)- 赋值运算符与赋值表达式 | 让代码变得更加简洁的主要内容,如果未能解决你的问题,请参考以下文章
☀️光天化日学C语言☀️(27)- 条件运算符 | 唯一的三目运算符
☀️光天化日学C语言☀️(34)- 函数进阶 | 面向过程编程