声明:此文章为作者自己学习c语言的笔记,给予记录,难免有谬误或纰漏,希望可以得到批评指 正^_^
文章中所有代码运行于DevC++ 6.3
- 算数操作符
- 移位操作符
- 位操作符
- 赋值操作符
- 单目操作符
#算数操作符(一些要注意的点)
1.整型的除法 1/2-->0
2.浮点型的除法 1.0/2-->0.5
1/2.0-->0.5
1.0.2.0-->0.5
3.取模操作符%(两端必须是整数)
#移位操作符
注意:移位操作符移动的是二进制位,分为:
>>右移操作符
<<左移操作符
!!!这两个操作符只针对整数!!!
(这里略过关于整数的原码、反码和补码相关的介绍)
需要知道:整数在内存中存储的是补码
##左移操作符(左边抛弃,右边补零)
##右移操作符
###逻辑移位(左边用0填充,右边丢弃)
###算数移位(左边用原该值的符号位填充,右边丢弃)
采用上述两个移位方式取决于编译器(只需要用负数测试一下就可以了)
!注意:移位操作符的位数不能是负数,这个是未定义的
#位操作符
## & - 按(2进制)位与
## | - 按(2进制)位或
## ^ - 按(2进制)位异或
我们不禁要发问:位操作符有什么用呢?(示例只是给出用法的举例,而不是普遍做法)
这里给一个题目:不创建临时变量,实现两个数的交换
由图中所说,这种方法在面对较大数字的时候存在溢出的问题
因此我们可以考虑使用位操作符(只限制于整数)
原理如下:
3^3
011
011
000--->两个相同的数字^的结果是0
0^5
000
101
101--->0异或一个数字的结果还是这个数字本身
因此有:
3^3^5 = 5
而:
3^5^3 = 5
因此我们可以得出结论:异或操作符支持交换律
但是在一般的开发过程中还是运用创建临时变量的方法,快,可读性高,不止限制于整数
下面再给一个题目进行思考:编写一个代码,求一个整数存储在内存中的二进制的1的个数
也就是:求补码的二进制中1的个数
下面给出思路:
如此一来统计即可
#赋值操作符
!注意区分赋值和初始化
##连续赋值(不建议这样写)
##复合赋值符
a = a>>1;
等价于:a >>= 1;
#单目操作符(只有一个操作数)
# !- 逻辑反操作
!注意:c语言中,0为假,非0为真
## +,- (正负号,单目)
## & - 取地址符
## sizeof
## ~ 对一个数的二进制位按位取反
这里我们思考,如何将一个数的二进制序列的某一位0改为1
## 前置后置--,++(注意先后顺序即可)
!注意,再for循环中++,--前置后置没有什么区别
## * - 间接访问操作符(解引用操作符)
还是和指针相关