❤️光天化日学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

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 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)- 函数进阶 | 面向过程编程

☀️光天化日学C语言☀️(36)- 作用域

☀️光天化日学C语言☀️(33)- 函数入门 | 开启下一个篇章!

☀️光天化日学C语言☀️(35)- 局部变量和全局变量

☀️光天化日学C语言☀️(32)- continue 关键字 | 下一个!