C语言之运算符

2023-05-31 0 321

操作方式符代表者的是各式各样的演算(操作方式)

未知的操作方式符:+ – * / =(表达式)

1.操作方式符的展开分类

操作方式符的展开分类方式许多,一般来说用机能或是操作方式数特征值展开展开分类

机能:数数操作方式符 方式论操作方式符 位操作方式符 门牌号操作方式符…….

操作方式数特征值:DD91操作方式符 双眼操作方式符 长瓣操作方式符

(1)数数操作方式符

+ – * / %(取余)

自增操作方式符(++)和自减操作方式符(–)的促进作用是对表达式展开金巴曲和珠鸡的操作方式

她们都是DD91操作方式符,只须要两个操作方式数

她们的采用方式有三种:前操作方式和后操作方式

前操作方式: ++cp; –cp; 后操作方式: cp++; cp–;

前操作方式的错误率十分高,一般来说在两条句子中种叠继续执行

后操作方式的错误率极低,一般来说在两条语句中最终继续执行

特别注意:

千万别在两个函数中数次采用自增和自减操作方式符,难导致语意

(2)亲密关系和方式论操作方式符

亲密关系和方式论操作方式符的原始数据是两个常量(真or假),采用亲密关系和方式论操作方式符就能形成方式论函数。

亲密关系操作方式符的错误率高于数数操作方式符

双眼的亲密关系操作方式符包括 == > < >= <= !=

函数成立,结果就为1,不成立,结果就为0

方式论操作方式符能形成复杂的方式论函数,方式论操作方式符的错误率比亲密关系操作方式符要低

方式论操作方式符包括 !(取反) &&(与) ||(或)

!是两个DD91的方式论操作方式符,促进作用是将两个常量(方式论函数)取反

与(&&)和或(||)属于双眼操作方式符,她们的促进作用就是构造复杂的方式论函数

与和或的演算规则:

C语言之运算符

方式论与,方式论或演算规则

记忆口诀:与演算—-全1为1,其他为0

或演算—-全0为0,其他为1

短路特性:

与演算和或演算具有短路的特性,如果前两个函数的已经能决定整个函数的结果,此时不会去计算后两个函数。

(3)位操作方式符

位演算就是对操作方式数展开对应的位之间的演算

以下演算都属于位演算:

& ———– 按位与

| ———— 按位或

^ ———– 按位异或

~ ———– 按位取反(DD91)

<< ——— 按位左移

>> ——— 按位右移

1)按位与 —- &

按位与将操作方式数对应的位展开与演算

3 & 5 = 0011 & 0101 = 0001 = 1

按位与能将一特征值字的某些二进制位清0

任何数与上0结果为0,任何数与上1结果不变

xxxx xxxx & 1111 0111 = xxxx 0xxx

2)按位或 —- |

按位或将操作方式数对应的位展开或演算

3 | 5 = 0011 | 0101 = 0111 = 7

按位与能将一特征值字的某些二进制位置一

任何数或上0结果不变,任何数或上1结果位1

xxxx xxxx | 0000 1000 = xxxx 1xxx

3)按位异或 —– ^

按位异或就是对应位展开异或演算

异或演算的演算方式是 相同为0,不同为1

C语言之运算符

异或演算规则

3 ^ 5 = 0011^0101 = 0110 = 6

按位异或能将一特征值字的某些二进制位取反

任何一特征值异或上1取反,任何一特征值异或上0不变

xxxx xxxx ^ 0000 1000 = xxxx yxxx(y是x取反)

口诀:与0清0,或1置1,异或1取反

4)按位取反 —— ~

促进作用是将某特征值的二进制位全部取反

~0xaf = 0x50 1010 1111 ——-> 0101 0000

5)按位左移 —— << 按位右移 ——— >>

移位操作方式将数字的所有二进制位当成两个整体水平左右移动

移位操作方式符属于双眼操作方式符,左边是要移位的数据,右边就是要移位的位数

移位会导致移位数字的某些数位丢失,也会空出一些位置

移位的操作方式方式:

左移移出的高位丢弃,空出的低位补0 ——- 方式论左移

无符号数据右移移出的低位丢弃,空出的高位补0 ——– 方式论右移

有符号数据右移移出的低位丢弃,空出的高位补符号位 ——- 数数右移

C语言之运算符

移位操作方式演示

如果移位操作方式中没有丢失有效数据(移出的位中没有1),左移n位就相当于将数字乘以2的n次方,右移n位就相当于将数字除以2的n次方

(4)采用位演算构造两个任意的二进制数

有一特征值字1111 1111,须要将第3-4位清0 ——–> 1110 0111

unsigned char ch = 255; //采用按位与对某些位清0 ch & ~(0x3<<3) = 1110 0111 = 0xe7

有一特征值字0000 0000,须要将第3-4位置1 ——–> 0001 1000

unsigned char ch = 0; //采用按位与对某些位清0 ch | (0x3<<3) = 0001 1000 = 0x18

有一特征值字1111 0000,须要将第3-4位取反 ——–>1110 1000

unsigned char ch = 240; //采用按位与对某些位清0 ch ^ (0x3<<3) = 1110 1000 = 0xe8

思考:采用位演算,构造出两个0xaf的字符类型的值

先清0后置1

(4)复合表达式操作方式符

大多数的双眼操作方式符,能和表达式运算符组合形成新的复合表达式操作方式符

+= -= *= /= %= &= |= ^= >>== <<==

当希望把演算结果保存到某个参与演算的操作方式数时能采用复合表达式操作方式符

a= a+b ———> a += ba = a<<b ———> a <<= b

复合表达式操作方式符的错误率和表达式操作方式符一样低。

(5)门牌号相关操作方式符

intnum; &num —–>表达式的门牌号

C词汇中采用%p占位符打印门牌号

(6)逗号操作方式符

逗号操作方式符促进作用用于合并两个函数,演算时取后两个函数的结果

逗号操作方式符的优先级高于表达式操作方式符

应用场景:

1.连接函数 2.声明多个同类型表达式 3.for循环中作为分隔符

(7)长瓣操作方式符

长瓣(条件)操作方式符的促进作用是根据某个函数的结果来选择继续执行的内容

格式:

函数 ? 公式1 : 公式2

如果函数为真,继续执行公式1,否则继续执行公式2

练习:采用长瓣操作方式符,将用户输入的大写字母变为小写字母,输入的小写字母变成大写字母。

2.类型转换

(1)自动类型转换

如果两个函数中包含多种类型的数据,C词汇会将这些数据转换成同一种数据类型后再展开处理。

这个转换过程由计算机自动完成,所以叫自动类型转换(隐式类型转换)

转换规则:

1)如果不同数据类型所占空间不同,就会把占用空间小的类型转换成占用空间大的类型

2)如果不同数据类型所占空间相同,就把整数类型转换成浮点类型

3)如果不同数据类型所占空间相同,就把有符号转换成无符号

特别注意:在实际开发中千万别采用自动类型转换,保证两个函数中的数据类型相同

(2)强制类型转换

能在C词汇中任意给数据指定类型,这种方式就叫强制类型转换

语法:

(指定的类型)原数据

强制类型转换几乎不受任何规则约束,有可能导致数据丢失

强制类型转换的实现是计算机临时生成两个新的数据,并不会改变原有数据

新数据的值来自于原数据,类型由强转类型指定

3.操作方式符的错误率和结合性

错误率:当在两个函数中出现多个不同错误率的操作方式符时,由错误率决定先演算还是后演算,错误率高的先演算,数字越小,错误率越高。

结合性:当在两个函数中出现了相同错误率的操作方式符,就要按照结合性的顺序来展开演算,结合性分为左结合(从左到右)和右结合(从右到左)

num + num_1 + num_2 ——>从左到右 num = num_1 = num_2——>从右到左

操作方式符错误率和结合性表格

C语言之运算符

操作方式符错误率和结合性表格(一)

C语言之运算符

操作方式符错误率和结合性表格(二)

4.C词汇函数的求值顺序

int num = 1; intnum_1 = num++ + num;

(1)顺序点

C词汇所有的演算都在函数中完成,函数本身完成以下两个内容

1)得到两个演算结果

2)产生副促进作用,所谓副促进作用就是会对函数中的表达式的值展开修改

++ — =…..i++——->演算结果是i的值,副促进作用是将i+1 ++i ——->演算结果是i+1,副促进作用是将i+1

顺序点表示的是副促进作用必须产生效果的最终时间,副促进作用产生效果一定在顺序点之前。

….. i++ …. 顺序点 …..

以num++ + num为例讨论顺序点对函数求值的影响

如果在演算加法的时候副促进作用已经生效,那么函数的演算结果为 2*num+1

如果在演算加法的时候副促进作用尚未生效,那么函数的演算结果为 2*num

(2)C词汇中规定的顺序点的位置

1)完整函数结束

函数句子结束

return句子

分支(if switch)和循环(for while)条件中

2)函数调用句子中,在是实参表达式完成和函数第两条句子继续执行之前

num++ + num在C词汇中的演算结果是多少,答案是不确定

(3)C词汇为什么不规定更多的顺序点来保证函数确定的继续执行顺序

C/C++不规定许多的顺序点,求值顺序可能不确定,Java严格规定了求值顺序(从左到右)。C/C++这种做法是有意的,在编译器设计和优化的时候就能根据实际需求去调整求值顺序,得到更高继续执行效率的代码。java规定了确定的求值顺序,在丧失了一定的效率获得了更加清晰地程序行为。一门编程词汇是否规定求值顺序是由其各自设计原则来决定的。

结论:

在C/C++中,任何依赖于特定继续执行顺序,依赖顺序点之间实现副促进作用的函数,其结果将得不到保证。

配套视频:深度解析C词汇

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务