文章目录
- 圆括号`()`
- 单目操作符
- 双目操作符
- 一、算术操作符* / %(乘除取余)
- 二、算术操作符+ -(加减)
- 三、移位操作符 << >>(左移和右移)
- 四、关系运算符 > < >= <=
- 五、关系运算符==和!=
- 六、按位操作符
- 三目操作符(条件操作符)
- 赋值运算符=
- 逗号表达式
- 杳杳碎碎念
C语言中有很多操作符,不同的操作符有优先级之分,相邻优先级高的先执行。接下来的操作符由高到底进行介绍。在此之前,请诸位道友先看下图,进行简单的理解。

圆括号()
圆括号()
可以改变优先级。其使用形式:(表达式)
或者函数名(参表)
。
单目操作符
单目操作符是由1个操作数的操作符。
单目操作符包括:负号,自增,自减,取地址运算符、解引用操作符、逻辑非、长度运算符(sizeeof),**注意!!!**级别一致,没有先后之分。
- 负号操作符,可以改变一个值的正负号。
int a = 10;
int b = -10;
printf("%d\n", -a);//运行结果为 -10
printf("%d\n", -b);//运行结果为 10
- 自增操作符:前置++ 先 + 1后使用; 后置++ 先使用,再+1
- 自减操作符: 前置-- 先 - 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
-
取地址操作符&
-
解引用操作符*
// *(解引用操作符/间接访问操作符)
//*p;解引用操作(间接访问操作)通过p存的地址,找到所访问的对象a *p等价a
int a = 20;
int* pa = &a;
*pa = 100;//*pa等价于a,100赋值给*pa,即100赋给a
printf("%d\n", a);
- !
if(!a)
等价于if(a==0)
,判断括号内是否为真。 - 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");
}
五、关系运算符==和!=
六、按位操作符
位操作符使用的是二进制中的补码。
- &: 有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
- ^:相同为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,两个同时为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
杳杳碎碎念
忙活一晚上,终于整完了。嗯……,其实有的还没有补充上,就这样吧😂😂😂