C 词汇 运算符 全站遍布世界各地重新整理
想看更快的排印,能看书名
观念填空
产品目录
@[toc]
节录
一 数数运算符
+
–
*
/
%: % 以内两端的数要都为有理数
二 位移运算符
>> : 右移
<<: 右移
例1:b = 20
例2:b = -4
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-APrIn3AF-1585038906075)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]
注意1:
右移直接在空的地方补0 如例1
右移有两种情况:
1.逻辑位移 补0
2.数数位移 补1 如例2(一般都是这种情况)
注意2:
位移运算符,不要移动负数位,这是标准未定义。
如:num >> -1//error
三 位运算符
& (按位与) | (按位或) ^(按位异或)
例3:按位与
例4:按位或
例5:按位异或
例6:异或的应用——交换两个值的内容
方法1:
方法2:(如果a,b很大可能会溢出)
方法3(异或法):
例7:怎么求一个二进制位中1的个数
unsigned的作用:
unsigned就是将这个二进制数最高位的符号位变成计数位。下面我们举个例子帮大家理解一下
如果我们输入的是-1
-1%2 == -1
-1/2 = 0
这样输出的count为0
但是我们知道-1的补码是11111111111111111111111111111111
这样我们的代码就局限在正有理数
如果加上unsigned 虽然我们输入的是-1 但是程序计算是是按照 unsigned int 的最大值,这样就避免了这个问题
更多位运算相关示例:https://github.com/hairrrrr/linux.ccode/tree/master/Bit/ClassCode/2020-1-7%EF%BC%888%EF%BC%89
四 赋值运算符
=
a = b = c
它的意义是将c的值赋给b,再将b的值赋给a。其实这样理解不够准确,其实应该这么写:
a = (b = c)
先将c的值赋给b 然后将这个整体,即b的值赋给a
五 复合赋值符
+= -= *= \= %= >>= <<= &= |= ^=
六 单目运算符
!
\-
=
&(取地址)
sizeof(操作数的类型长度)
~ (对一个数的二进制位按位取反)
— ++(前置,后置)
* (解引用)
(类型)(强制类型转换)
例8:!的应用
应用!与flag来判断情况做出选择
if(flag){
flag为真进入循环;
}
if(!flag){
flag为假进入循环;
}
printf函数打印格式
%#p 0XCCCCCC
%p 00CCCCCCC
%x cccccc
%X CCCCCC
例9:~ 的应用
七 关系运算符
>
>=
<=
!=
==
注意:不要将 ‘ == ’ 写成 ‘ = ’
八 逻辑运算符
&&
||
例11 &与&&的差异:
例12 这个题值得思考
在&&的判断中如果一边位假(0)那么程序就会停止向后面判断。所以++b与d++并没有执行
在 || 的判断中如果一边为真,则停止继续向下判断。(如:++a || b++ || c)
补充:
九 条件运算符
a > b ? a : b
十 逗号表达式
a,b,c,d,…..n
逗号表达式整体的值等于最后一个表达式的值
例13 思考题
另一种代码书写方式:
合理应用逗号表达式能简化代码。
11 其他
1. [] 下标引用运算符
对于数组 arr[5] = {1,2,3,4,5}
我们一般的用法是:
arr[0],arr[1],arr[2]…..其中arr[0]就代表访问数组中第一个元素,arr[1]代表访问第二个以此类推
学习了指针之后我们知道:
arr代表数组首元素的地址。
arr[0],arr[1],arr[2]…我们能改写成:arr,(arr+1),(arr+2)….. (arr能理解为*(arr+0))
进一步思考:
(arr+1)能改写成(1+arr)
那么arr[1]可否写成1[arr]呢?答案是肯定的。
所以我们就有了一下结论:
1[arr] == arr[1] == *(arr+1) == *(1+arr)
事实上,无论哪一种写法,程序再最终编译的时候都会转化为:*( arr+1)
2. ( ) 函数调用运算符
例14.有参数调用
例15.无参数调用
3.访问一个结构的成员
. (结构体.成员名)
-> (结构体指针 -> 成员名)
例16.
12 表达式求值
1. 隐式类型转换
C的整型算术运算总是至少以缺省整型类型的精度来进行的。为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。整型提升的意义:
表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度 一般就是int的字节长度,同时也是CPU的通用寄存器的长度。
因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长 度。
通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令 中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都要先转 换为int或unsigned int,然后才能送入CPU去执行运算。
整型提升方法:
正数的整型高位补充0 负数补充1
例17.整型提升示例
注:char是有符号的
补充:字符类型的反码(1字节)及其表示的值
总结:
char 的值范围是:-128 ~ 127
unsigned char 值的范围是:0 ~ 255
例18.整型提升在程序中的证明
例子20.整型提升的再一次证明
2. 数数转换
如果某个运算符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类 型,否则操作就无法进行。下面的层次体系称为寻常算术转换。
long double 8byte
double 8byte
float 4byte
unsigned long int 4byte
long int 4byte
unsigned int 4byte
int 4byte
如果某个操作数的类型在上面这个列表中排名较低,那么首先要转换为另外一个操作数的类型后执行运算。
附:各类型变量在内存中占的字节(32位)
3. 运算符属性
运算符的优先级运算符的结合性是否控制求值顺序 在 Github 上看更全的文章产品目录:
https://github.com/hairrrrr/C-CrashCourse这个系列文章的代码都会上传上去,欢迎 star
以上就是本次的内容。
如果文章有错误欢迎指正和补充,感谢!
最后,如果你还有什么问题或者想知道到的,能在评论区告诉我呦,我能在后面的文章加上你们的真知灼见。
我是程序圆,我们下次再见。