【C语言】操作符详解(下篇)

简介: 【C语言】操作符详解(下篇)

6.关系操作符

👉 > —> 大于
👉 >= —> 大于等于
👉 < —> 小于
👉 <= —> 小于等于
👉 != —> 用于测试“不相等”
👉 == —> 用于测试“相等

这些操作符都比较简单,都是大家比较熟悉的

🚨需要注意的是:在写程序的过程中不要把==和=写混,容易导致错误


7.逻辑操作符

🥳只关注真假

&& — 逻辑与 — 两个都为真才为真(1),只要有一个为假就为假(0)
|| — 逻辑或 — 只要有一个为真就为真(1),两个都为假才为假(0)

例如:上代码⬇️

bee9f93a0e0244d48bcfef1ea4a1879d.png

50fde7a4e33b43dbba981bc4fdf23a6e.png

🚨要注意和按位与&、按位或| 进行区分
🚨位操作符关注二进制位

🥳 1 & 2 ----> 0
🥰1 && 2 ----> 1
🥳1 | 2 ----> 3
🥰1 || 2 ----> 1


👇这里我们来道面试题👇

07d48ef8e1504fa19c92a4006c3058ea.png

思考一下,结果为多少呢?🤗

1,3,3,4?还是1,2,3,4?

1e106875e3c24eb0b7e7b9aac63ed32d.png

有小伙伴肯定会好奇,想不明白为什么会是1,2,3,4呢?

ce2e159c59cb4072b437e32ac03af736.png

👇我们在稍微改一下👇

ee9945d18131468ea98670c4658870b6.png

这次结果是什么呢?🤗

84ab60d48d24436c83b00f1b3617e85f.png

👇很有意思吧!我们改变一下再来一道👇

3bb35297ce9d48608c000e39fbd3f586.png

这次结果是什么呢?🤗

a7acf7639d924f748b9f46abb0f36c82.png

为什么呢?明明a++为真了,为什么后面也不计算了呢?

真相就是如此,因为a++已经为真了,所以后面的++b和d++也同样不用计算了

65836b254f404f9aa109a87da565f8e8.png

8.条件操作符

🥳 exp1 ? exp2 : exp3

😇表达式exp1如果为真,那么exp2就为结果,如果表达式exp1为假,则exp3为最后结果

👇看代码👇

02e00dce68a2431f8ec7e91a43fd0c1e.png

我们想把这段条件表达式改用条件操作符可以怎么写?🤗

c39d4f09a8e94492b6fd9059f1da23f5.png

简洁方便了很多☝️


9.逗号表达式

🥳 exp1 , exp2 , exp3, … expN

😇逗号表达式,就是用逗号隔开多个表达式
😇逗号表达式,从左向右依次执行,最后一个表达式的结果就是整个表达式的结果。

d629edffbf6843ba8e0908cb097885c6.png

8821451f83374287a98abfe33df14f33.png

🚨在if、while循环判断语句中,可以使用用来判断表达式是否为真,如果为假就不执行进入循环体或者表达式中了


10.下标引用操作符

🥳 [ ] ----> 下标引用操作符
🥳 操作数:一个数组名 + 一个索引值

例如:看代码⬇️

76332459f8a7466da717c3b48fd5f3af.png


11.函数调用操作符

🥳 ( ) ----> 函数调用操作符

🚨接受一个或多个操作数: 第一个操作数是函数名,剩余的操作数就是传递给函数的参数

例如:看代码⬇️

03079c4ca21e4b7d8bc04497c2591791.png

5ce2ced8242f462280a9d1371003de38.png

🥰希望大家能够理解🥰


12.结构成员访问操作符

🥳访问一个结构的成员
🥳 . 结构体变量 . 结构体成员名
🥳 -> 结构体指针 -> 结构体成员名

☝️分情况酌情使用☝️

930a0806b88a4e449e9f737f3090c470.png

b5c728da9cf7467da84e43719ad0c10b.png

13.表达式求值

🥳表达式的执行顺序一部分是由操作符的优先级和结合性来决定的
🥳同样,有些表达式的操作数在求值的过程中可能需要转换为其他类型


13.1.隐式类型转换

🚨C的整型算术运算总是至少以缺省整型类型(int)的精度来进行的,为了获得这个精度,表达式中的字符型和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升


🙌整型提升的意义:🙌

表达式的整型运算要在CPU的相应运算器件内执行,CPU内路型运算器(ALU)的操作数的字节长度一般就是int的字节长度,同时也是CPU的通用奇存器的长度。

因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。

通用CPU (general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsigned int, 然后才能送入CPU去执行运算。


⬇️看代码⬇️

62c1da64611543229f2a73132f533ddb.png

d51538f417bd4f83a1fc10eb4999aa79.png

20a28cee8cdf446bbf786cf661e23f1d.png

🚨负数整型提升:高位补充符号位,即为1
🚨正数整型提升:高位补充符号位,即为0
🚨无符号整型提升:高位直接补0

⬇️再看一段代码,希望大家能够理解 整型提升是存在的⬇️

ad0945757e85448ca06d875a030f5070.png

13.2.算术转换

🥳 如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类型,否则操作就无法运行,下面的层次体系称为寻常算术转换

☝️ long double -----------☝️

☝️ double ------------------☝️

☝️ float ---------------------☝️

☝️ unsigned long int ----☝️

☝️ long int -----------------☝️

☝️ unsigned int -----------☝️

☝️ int ------------------------☝️

🥳如果某个操作数的类型排名比较低,那么首先要转换为另一个操作数的类型后再执行运算

🥰希望大家能够理解🥰


13.3.操作符的属性

👉复杂的表达式求值有三个影响因素:⬇️
👉1.操作符的优先级
👉2.操作符的结合性
👉3.是否控制求值顺序

🚨两个相邻的操作符先执行哪个 取决于他们的优先级,如果两者的优先级相同,则取决于两者的结合性

⬇️这里给大家放上一张操作符优先级表,从上至下代表优先级 由高到低⬇️

4f88a5c3c4784e0985a0c832a0cdee36.jpg

🤗了解了操作符优先级和结合性之后是不是就可以确定表达式的唯一值了呢? NO! NO! NO!

🤗要是这样认为就太片面了,这个东西它坏得很,坑有很多,我们要小心再小心,细心再细心!🚨

举个简单的例子:👇请看这个表达式👇

585b4379e4f140d99d3407d01e892105.png

这样一个式子看起来很简单是吧,其实这就不是一个好的代码,这是个问题代码

我们知道,两个相邻的操作符执行的先后顺序取决于优先级和结合性,那么知道了 * 的优先级大于 + 的优先级,但是大家有没有想过不相邻的我们怎么先后执行的顺序会不会不是唯一的,也就是说谁先算是不确定的

👇这样说大家可能不太理解,看下面这个图👇

28601bd257e949d2b27a8151e2cb0ba3.png

这样就没有唯一的值,因为我们只能确定相邻的 * > + ,可是不相邻的八竿子打不着,所以可以有其他的运算顺序,如果a,b,c,d,e,f分别代表着表达式,那么执行起来的话就会有问题,可能导致运行不了

⬇️看一下这段代码输出结果为多少?⬇️

f9b59995f7e74c9280606c45f91519e4.png

这个代码有没有问题呢?

我们知道 * 的优先级> + 的优先级,所以只知道先算乘法后算减法,但是调用的顺序我们无法通过操作符优先级来得知,所以顺序可能为这样👇

5d3e91861ac7447b96ca61878ee0dab9.png

🙌具体会输出多少最终还是取决于编译器,编译器不同,结果可能不同

🥰希望大家能够理解

这里还有很多例子,就没必要深入讲解了

😇总结: 我们写出的表达式如果不能通过操作符的属性确认唯一的结果,那这个表达式就是存在问题的,我们要避免写出这种”猪队友“代码!


总结🥰

以上就是操作符详解下篇内容啦🥳🥳🥳🥳
小的会继续学习,继续努力带来更好的作品😊😊😊
创作写文不易,还多请各位大佬uu们多多支持哦🥰🥰🥰

93ab8a78d86a446d8dcb876da468e530.gif

目录
相关文章
|
1月前
|
存储 C语言 索引
【C语言篇】操作符详解(下篇)
如果某个操作数的类型在上⾯这个列表中排名靠后,那么⾸先要转换为另外⼀个操作数的类型后执⾏运算。
|
1月前
|
程序员 编译器 C语言
【C语言篇】操作符详解(上篇)
这是合法表达式,不会报错,但是通常达不到想要的结果, 即不是保证变量 j 的值在 i 和 k 之间。因为关系运算符是从左到右计算,所以实际执⾏的是下⾯的表达式。
|
1月前
|
C语言
C语言操作符(补充+面试)
C语言操作符(补充+面试)
36 6
|
1月前
|
存储 编译器 C语言
十一:《初学C语言》— 操作符详解(上)
【8月更文挑战第12天】本篇文章讲解了二进制与非二进制的转换;原码反码和补码;移位操作符及位操作符,并附上多个教学代码及代码练习示例
47 0
十一:《初学C语言》—  操作符详解(上)
|
2月前
|
C语言
五:《初学C语言》— 操作符
本篇文章主要讲解了关系操作符和逻辑操作符并附上了多个代码示例
37 1
五:《初学C语言》—  操作符
|
3月前
|
C语言
C语言逻辑操作符的短路问题
C语言逻辑操作符的短路问题
|
3月前
|
编译器 C语言
【C语言】:中移位操作符,位操作符详运算规则详解
【C语言】:中移位操作符,位操作符详运算规则详解
30 1
|
3月前
|
存储 编译器 C语言
|
3月前
|
存储 C语言 索引
【C语言基础】:操作符详解(二)
【C语言基础】:操作符详解(二)
|
3月前
|
编译器 C语言
C语言学习记录——操作符详解知识点选记(算术操作符、单目操作符、移位操作符、关系操作符、逻辑操作符、条件操作符......)二
C语言学习记录——操作符详解知识点选记(算术操作符、单目操作符、移位操作符、关系操作符、逻辑操作符、条件操作符......)二
39 3