C语言操作符详解

本文详细介绍了C语言中的操作符分类,包括算术、移位、位、赋值、单目、关系、逻辑、条件、逗号表达式、下标引用和函数调用等内容,以及它们的规则和应用场景。
摘要由CSDN通过智能技术生成

7cd99489e54840d5a7676b460e9de316.png

                 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,其中*,/的优先级相同,因为它们都是左结合运算符,所以从左到右执行,先进行*,在进行/

运算符的优先级顺序很多,这里我给大家用一张表格展示出来。

0bc52e93f64544b193ba7eac74f9c36c.png

以上就是C语言操作符的大概知识,如果以上对你理解操作符有帮助,我感到很荣幸,如果有什么问题,可以在评论留言,我会积极改正。

我是一代,我们下篇博客见。

 

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值