hello,大家好,我是一代,今天我来给大家讲解操作符的有关知识
1.操作符分类
1.算术操作符:+,-*,/,%
2.移位操作符:<< ,>>
3.位操作符:&,|,^
4.赋值操作符:=,+=,-=,*=,/=,%=,<<=,>>=,&=,|=,^=
5.单目操作符:!,++,--,&,*,+,-,~,sizeof,(类型)
6.关系操作符:>,>=,<,<=,==,!=
7.逻辑操作符:&&,||
8.条件操作符:?,;
9.逗号表达式:,
10.下标引用:[]
11.函数调用:()
12.结构访问操作符:. ,->
2.移位操作符
1.左移操作符
移位规则:左边抛弃,右边补0
#include<stdio.h>
int main()
{
int num = 10;
int n = num << 1;
printf("%d\n", n);
return 0;
}
其中10的补码为0000 0000 0000 1010
向左移动一位的结果变为0000 0000 0001 0100
2.右移操作符
移位规则:
1.逻辑右移:左边用0补充,右边丢弃
2.算术右移:左边用该原值的符号位补充,右边丢弃
注意:大多编译器使用的是算数右移
将-1向右移动一位
逻辑右移
-1的补码:1111 1111 1111 1111
-1向右移动一位:0111 1111 1111 1111
算数右移
-1的补码:1111 1111 1111 1111
-1向右移动一位:1111 1111 1111 1111
注意:对于移位操作符不要移动负数位,这个是标准未定义的。
3.位操作符
& 按位与
| 按位或
^ 按位异或
~ 按位取反
注意:它们操作数必须是整数
1.按位与&
参加运算的两个数据,按二进制位进行“与”运算。运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1;即:两位同时为“1”,结果才为“1”,否则为0。
例如3&5
3的补码为0000 0000 0000 0011
5的补码为0000 0000 0000 0101
3&5结果为0000 0000 0000 0001
&运算的特殊用处:
(1)清零,如果想要一个二进制数全部变为0,只要与一个各位都为0的数相&就可以清零
如6&0
6的补码为0000 0000 0000 0110
0的补码为0000 0000 0000 0000
6&0的结果为0000 0000 0000 0000
(2)取一个数的指定位
如果想要一个数得指定位上为一 ,其他位上为0,就可以与一个指定位上为1,其他位上为0的数相&
如一个数的二进制位为0000 1000 1001 0000,我想要保留第五位上的1,我就可以将其与
二进制位为0000 0000 0001 0000的数相&
2.按位或|
参加运算的两个对象,按二进制位进行“或”运算。
运算规则:0|0=0; 0|1=1; 1|0=1; 1|1=1;
即 :参加运算的两个对象只要有一个为1,其值为1。
如3|5
3的补码为0000 0000 0000 0011
5的补码为0000 0000 0000 0101
3&5结果为0000 0000 0000 0111
|运算的特殊作用
用来使一个数的某些二进制位上置为1
如一个数的二进制为0000 0000 0000 0001,要使其的第五位置为1,
将其与0000 0000 0001 0000就行|运算就可以了。
3.按位异或^
参加运算的两个数据,按二进制位进行“异或”运算。
运算规则:0^0=0; 0^1=1; 1^0=1; 1^1=0;
即:参加运算的两个对象,如果两个相应位为“异”(值不同),则该位结果为1,否则为0。
其符合如下规律:
交换律:a^b=b^a
结合律:a^b^c=a^(b^c)=(a^b)^c
自反律:a^b^b=a^0=a
b^b=0 ,b^0=b
这里有一道面试题如下:不能创建临时变量,实现两个数的交换:
这里有一个不太完美的代码如下:
#include<stdio.h>
int main()
{
int a = 4;
int b = 2;
a = a + b;
b = a - b;
a = a - b;
printf("%d %d", a, b);
return 0;
}
但其实上面代码有一种缺陷,如果a+b超出了整形的范围,以上代码就不可以实现两个数的交换
这里还有一种巧妙方法 :就是用^对其进行处理。
代码如下:
#include<stdio.h>
int main()
{
int a = 5;
int b = 3;
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("%d %d", a, b);
return 0;
}
这里可能有点难以理解,但如果结合上面的运算法则就不难了
因为a=a^b
b=a^b=a^b^b=a^0=a
a=a^b=a^b^a=b^0=b
4.逗号表达式
逗号表达式,就是用逗号隔开的多个表达式
其从左往右依次执行,整个表达式的结果就是最后一个表达式的结果。
1.
#include<stdio.h>
int main()
{
int a = 1;
int b = 2;
int c = (a > b, a = b + 10, b = a + 1);
printf("%d", c);
return 0;
}
这里求c的值,因为逗号表达式是从左往右执行,a>b对a和b都没有影响,a=b+10,则a=12,最后b=a+1,b的值为13,则最后c的值为13。
2.
a = mul();
fact(a);
while (a > 0)
{
//业务处理
a = mul();
fact(a);
}
因为以上代码中有重复步骤,就可以将以上代码有逗号表达式表示为
while (a = mul(), fact(), a > 0)
{
//业务处理
}
5.下标引用操作符
操作数:一个数组名+一个索引值
int arr[10];//创建数组
arr[9]=10;//实用下标引用操作符
[ ]的两个操作数是arr和9
6.函数调用操作符
接收一个或者多个操作数:第⼀个操作数是函数名,剩余的操作数就是传递给函数的参数
7.操作符的优先级和结合性
1.优先级
优先级指的是,如果⼀个表达式包含多个运算符,哪个运算符应该优先执⾏。各种运算符的优先级是不⼀样的。
如3+4*5就是先进行*,在进行+
2.结合性
如果两个运算符优先级相同,优先级没办法确定先计算哪个了,这时候就看结合性了,则根据运算符是左结合,还是右结合,决定执行顺序。大部分运算符是左结合(从左到右执⾏),少数运算符是右结合(从右到左执行),比如赋值运算符( = )
如4*3/2,其中*,/的优先级相同,因为它们都是左结合运算符,所以从左到右执行,先进行*,在进行/
运算符的优先级顺序很多,这里我给大家用一张表格展示出来。
以上就是C语言操作符的大概知识,如果以上对你理解操作符有帮助,我感到很荣幸,如果有什么问题,可以在评论留言,我会积极改正。
我是一代,我们下篇博客见。