☀️光天化日学C语言☀️(20)- 赋值运算符 | 让代码变得更加简洁

举报
英雄哪里出来 发表于 2021/08/08 08:34:31 2021/08/08
【摘要】 让代码变得更加简洁

一、前言

  本文作者是从 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

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、位赋值运算符

运算符 简称 描述 举例
&= 按位与且赋值运算符 左边操作数 按位与上 右边操作数 的结果赋值给 左边操作数 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 e 2 e_2 ,有复合赋值表达式:
  • e 1   o p =   e 2 e_1 \ _{op=} \ e_2

  • 等价于:
  • e 1 = ( e 1 )   o p   ( e 2 ) e_1 = (e_1) \ _{op} \ (e_2)

  • 其中 o p op 就是上文提到的那 10 个 复合赋值运算符。

这样写的好处有三个:
  1)前一种形式, e 1 e_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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。