C语言中的操作符

文章目录

  • 圆括号`()`
  • 单目操作符
  • 双目操作符
    • 一、算术操作符* / %(乘除取余)
    • 二、算术操作符+ -(加减)
    • 三、移位操作符 << >>(左移和右移)
    • 四、关系运算符 > < >= <=
    • 五、关系运算符==和!=
    • 六、按位操作符
  • 三目操作符(条件操作符)
  • 赋值运算符=
  • 逗号表达式
  • 杳杳碎碎念

C语言中有很多操作符,不同的操作符有优先级之分,相邻优先级高的先执行。接下来的操作符由高到底进行介绍。在此之前,请诸位道友先看下图,进行简单的理解。
在这里插入图片描述

圆括号()

圆括号()可以改变优先级。其使用形式:(表达式)或者函数名(参表)

单目操作符

单目操作符是由1个操作数的操作符。
单目操作符包括:负号,自增,自减,取地址运算符、解引用操作符、逻辑非、长度运算符(sizeeof),**注意!!!**级别一致,没有先后之分。

  1. 负号操作符,可以改变一个值的正负号。
int a = 10;
int b = -10;
printf("%d\n", -a);//运行结果为 -10
printf("%d\n", -b);//运行结果为 10
  1. 自增操作符:前置++ 先 + 1后使用; 后置++ 先使用,再+1
  2. 自减操作符: 前置-- 先 - 1后使用; 后置-- 先使用,再-1
 int a=5;
 int b=6;
 int c=7;
 int d=8;
 printf("%d\n",a++);//a++=5(先使用,再+1),a=6
 printf("%d\n",++b);//++b=7(先+1,再使用),b=7
 printf("%d\n",c--);//c--=7(先使用,再-1),c=6
 printf("%d\n",--d);//--d =7(先-1,再使用),d=7
  1. 取地址操作符&

  2. 解引用操作符*

// *(解引用操作符/间接访问操作符)
//*p;解引用操作(间接访问操作)通过p存的地址,找到所访问的对象a *p等价a
int a = 20;
int* pa = &a;
*pa = 100;//*pa等价于a,100赋值给*pa,即100赋给a
printf("%d\n", a);
  1. if(!a)等价于if(a==0),判断括号内是否为真。
  2. sizeof:其返回值为无符号整数,%zd打印无符号整型,sizeof的专用。sizeof计算的结果为单位是字节!!!!。 类型不能省括号 ,表达式可以。若sizeof(表达式)表达式不会真正计算,只会判断结果的类型,根据类型求长度。
//sizeof(类型)
printf("%zd\n", sizeof(char));//1
printf("%zd\n", sizeof(short));//2
printf("%zd\n", sizeof(int));//4
printf("%zd\n", sizeof(long));//4
printf("%zd\n", sizeof(long long));//8
printf("%zd\n", sizeof(float));//4
printf("%zd\n", sizeof(double));//8
printf("%zd\n", sizeof(long double));//8
printf("%zd\n", sizeof(_Bool));//1
//sizeof(表达式),表达式可以省括号。
int a=4;
printf("%d\n",sizeof a);

双目操作符

双目操作符是有2个操作数的运算符。不同双目操作符中优先级不近相同。
接下来让我们来看看双目操作符的优先级情况吧。注意每一个小标题是一个级别(从高到底)。
逻辑操作符因为标题最多是六个的缘故,无法清晰地展现逻辑操作符的级别情况,因此我在按位操作符的最后进行了补充。感谢理解。

一、算术操作符* / %(乘除取余)

/除号两端如果都是整数的话,按整数除法,所得结果直接截断小数部分,取整数。
如果要计算出小数的结果,两端至少有一个数为小数。请看例图。

printf("%d\n", 5 / 2);
//运行结果为2,直接截断了小数部分
printf("%lf\n", 5 / 2.0);
//运行结果为2.5

%取余,操作数只能是整数。运行结果的正负情况,看左操作数的符号。请看下图。在这里插入图片描述

二、算术操作符+ -(加减)

加减不做过多评述。

printf("%d\n",10+20);
printf("%d\n",10-20);

三、移位操作符 << >>(左移和右移)

移位操作符 操作数只能是整数,移的是补码,需要将整数转化为二进制,将原码改为补码。正数的补码与原码一样,负数的补码是原码取反(符号位不变)+1。
<<左移操作符:左边抛弃,右边补零
>> 右移操作符:分2种格式,取决于编译器实现,常见的编译器采用算术右移!!!
第一种:逻辑右移:左边补0,右边抛弃
第二种:算术右移:左边用原该值的符号位填充,右边丢弃
如何区分左移和右移操作符???,一开始经常记混,后来才知道其中的记法。看箭头指向哪里,就是哪移操作符。
<< 箭头往左,即左移操作符;>>箭头往右,即右移操作符。
左移操作符

/int a = -10;
	//1000000000000000000000000001010 -a的原码
	//1111111111111111111111111110101 -a的反码
	//1111111111111111111111111110110 -a的补码
int b = a << 1;//左移一位,有乘以2的效果。
	//1111111111111111111111111110110 -a的补码
  //1 111111111111111111111111110110  左边丢弃,右边补零。
    //1111111111111111111111111101100 移动后的补码 -b
	//1000000000000000000000000010011 取反(符号位不变)
	//1000000000000000000000000010100 +1 即%d的值  -20
printf("b=%d,a=%d\n", b, a);

右移操作符,具体是逻辑右移,还是算术右移?
逻辑右移(主要用于无符号数),不考虑符号位;
算术右移(主要用于有符号数),考虑符号位。
正数不需要考虑逻辑还是算术,结果都是一样的。

无符号数

/int a = 10;//无符号数 无所谓 逻辑还是算术右移
	//0000000000000000000000000001010 -a的补码
int b = a >> 1;//右移一位,有除以2的效果。
	//0000000000000000000000000001010 
    //0000000000000000000000000001010 
	//0000000000000000000000000000101 
printf("b=%d,a=%d\n", b, a);

有符号数

int a = -10;
	//1000000000000000000000000001010 -a的原码
	//1111111111111111111111111110101 -a的反码
	//1111111111111111111111111110110 -a的补码
int b = a >> 1;//右移一位,有除以2的效果。
	// 1111111111111111111111111110110 -a的补码
    // 1111111111111111111111111110110 -
    // 1111111111111111111111111111011 -移动后的补码
	// 1000000000000000000000000000100 -符号位不变
	// 1000000000000000000000000000101 即b的值 -5
printf("b=%d,a=%d\n", b, a);

四、关系运算符 > < >= <=

关系表达式的返回值为0 / 1 常用于if(while)结构

int a=5;
if(a>0)
{
printf("a为正数\n");
}

五、关系运算符==和!=

六、按位操作符

位操作符使用的是二进制中的补码。

  1. &: 有0则0,两个同时为1为1
int a = 4;
//00000000000000000000000000000100 -- 4 原码(补码)
int b = -7;
//10000000000000000000000000000111 - -7 原码
//11111111111111111111111111111000
//11111111111111111111111111111001 - -7补码

//求        4&-7
//    11111111111111111111111111111001 - -7补码
// & 		有0则0,两个同时为1为1
//    00000000000000000000000000000100
//    00000000000000000000000000000000 - 0补码(原码)
int c = a & b;
printf("%d", c);//运行结果为0
  1. ^:相同为0,相异为1
int a = 4;
//00000000000000000000000000000100 -- 4 原码(补码)
int b = -7;
//10000000000000000000000000000111 - -7 原码
//11111111111111111111111111111000
//11111111111111111111111111111001 - -7补码
int c = a ^ b;
//11111111111111111111111111111001 - -7补码
// ^     相同为0,相异为1
//00000000000000000000000000000100
//11111111111111111111111111111101 - 补码
//10000000000000000000000000000010 - 取反
//10000000000000000000000000000011 - +1
//printf("%d", c);//运行结果为 -3
  1. |:有1则1,两个同时为0为0
int a = 4;
//00000000000000000000000000000100 -- 4 原码(补码)
int b = -7;
//10000000000000000000000000000111 - -7 原码
//11111111111111111111111111111000
//11111111111111111111111111111001 - -7补码
int c = a | b;
//求        4|-7
//11111111111111111111111111111001 - -7补码
// |       有1则1,两个同时为0为0
//00000000000000000000000000000100
//11111111111111111111111111111101 - 补码
//10000000000000000000000000000010 - 取反
//10000000000000000000000000000011 - +1
printf("%d", c);//运行结果为 -3

除此之外,紧接着双目操作符还有逻辑&&和逻辑或||两个级别,逻辑操作符一般出现在if语句中,逻辑操作符请看下文介绍。
逻辑与 &&:两个条件都得满足。

逻辑或||: 至少有一个满足。

针对逻辑操作符,还有一种好玩的现象:短路
&&, 左边为假,右边无需计算,整体为假
|| 左边为真,右边无需计算,整体为真

//短路针对逻辑运算符,先对左边表达式取值,再对右边表达式求值
//&&, 左边为假,右边无需计算,整体为假
//|| 左边为真,右边无需计算,整体为真
//&& 左边表达式结果为假,右边表达式不再执行
//|| 左操作数的结果为真,右边表达式无需执行*
int i = 0, a = 0, b = 2, c = 3, d = 4;
//存在短路情况
i = a++ && ++b && d++;
i = a++ || ++b || d++;
printf("a=%d,b=%d,c=%d,d=%d,i=%d", a, b, c, d, i);

三目操作符(条件操作符)

三目操作符是有三个操作数的操作符。
条件操作符的表现形式:表达式1?表达式2:表达式3,若表达式1为真,表达式2计算,表达式3不算。

赋值运算符=

= 将右边的值赋给左边变量a=100;

int i = 0;
	for (i = 0; i<10; i++)
	{
		if (i = 5)//此时将5赋给变量i,每个i进入循环,都会赋成5,导致了5的死循环
			printf("%d ", i);
	}

复合赋值,需要从右往左依次计算。
复合赋值包括:+= 、-=、*=、/=、%=

b += a++ + c;

逗号表达式

逗号表达式,从左往右依次执行,其值为最右边表达式的值。

int a, b, c;
a = 5;
c = ++a;//c=6,a=6
b = ++c, c++, ++a, a++;//b=7
//  7    7     7    7  c=8,a=8
b += a++ + c;
//b+=8+8=16,b=b+16=7+16=23
printf("a = %d b = %d c = %d\n:", a, b, c);//9 23 8

杳杳碎碎念

忙活一晚上,终于整完了。嗯……,其实有的还没有补充上,就这样吧😂😂😂

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值