移位操作符移动的是二进制位
>> 右移
<< 左移
(移位操作符的操作数只能是整数,小数编译器会直接报错)
【原码、反码和补码已经在上一篇介绍过了:CSDN】
左移操作符:
规则——左边抛弃,右边补零
具体操作如下:(将a向左移动1位,正数负数操作一样)
右移操作符:
右移运算有两种:逻辑右移:右边丢弃,左边用零补齐
算数右移:左边用原该值的符号位填充,右边丢弃
当前常见的编译器都是算数右移,不会出现逻辑右移的结果
*注意:移动位数要用正数表示,负数是标准未定义的行为且不宜大于32位,超出范围计算结果就毫无意义了。
"对正数负数左移一位都有*2的效果 ,正数右移有/2效果,负数右移有特殊情况,大部分也是有/2效果"
复合赋值可以表示成:a>>=1 a<<=1
a>>=-1 a<<=-1
这个和加减的复合赋值类似。
位操作符:&、 |、 ^、 ~
& ——按位与 &&——逻辑与
| ——按位或 | |——逻辑或
^ ——按位异或
~ ——按位取反
(操作数都要是整数)
下面是对这四个位操作符的用法做一个简单的讲解
&:
&对应的二进制位有0则与0,都1则与1,如下:
| :
| 对应的二进制位有1即1,全0则0,如下:
^:
^ 对应的二进制位相同为0,相异为1,如下:
~ :
~对应的二进制位是0的变成1,1的变成0,如下:
这里我们给出一个题目:只可以使用两个变量实现两个数交换的问题
我们可以使用下面这种简单的方法,但是这种方法有一个严重的问题:int类型的整型有一定的存储范围,当a,b的数值很大,且单个值不超过整型的范围,而a+b的值超出整型的范围就会导致存储丢失,得出结果错误。
而这里使用^就很好的解决了这个问题
这里我们讲下这个方法:
a^a=0 —— 相同的两个数字异或结果就是0
0^a=a —— 0和任何数字异或的结果就是那个数字
通过这个例子得出的两个结论就可以很好的解释这个方法,
为了加深理解以上操作符,下面给出相关的简单练习:
位操作符和位移操作符的简单练习 请看: CSDNhttps://mp.csdn.net/mp_blog/creation/editor/138167738
逗号表达式:
形式:由逗号隔开的多个表达式
特点:从左向右依次执行,整个表达式的结果是最后一个表达式的结果
#include <stdio.h>
int main()
{
int a = 3;
int b = 5;
int c = 6;
if (b = a + 6, a = a + 2, c < 8)
{
}
return 0;
}
在这里面if语句判断的标准就是最后一个表达式:c<a+c+b,但是我们还是必须要从左向右一次计算表达式,最后再看最后一个表达式。就比如在上面的程序中如果前面的表达式影响到了c,那么最后一个表达式的结果就和原来会有差异。
[ ] 下标引用操作符
操作数:一个数组名+一个索引值(下标)
int arr[10]={0};
printf(“%d”,arr[1]);——这里的[]就是 下标引用操作符
arr是数组名
2就是索引值
()函数调用符
printf(“holle world”) 这里的()就是函数调用符
有一个或多个操作数:第一个操作数是函数名;其他的都是传给函数的参数
注:函数调用符最少一个操作数(函数名)