C语言篇 -(1)初识C语言 – (8)操作符
- 前言
- 算术操作符
- 赋值操作符
- 单目操作符
- 关系操作符
- 逻辑操作符
- 条件操作符
- 逗号表达式
- 下标引用、函数调用和结构成员
前言
C语言是非常灵活的
C语言提供了非常丰富的操作符,使得使用起来就比较灵活,我们这篇来简单了解一下操作符
下面的有些操作符会不介绍,以后再说
算术操作符 |
⭐+⭐-⭐*⭐/⭐%加减乘 除取模下面会重点讲一下⭐/和⭐%
移位操作符(涉及二进制的运算,学到这里再讲) |
⭐>>⭐<<右移操作符 左移操作符
位操作符(涉及二进制的运算,学到这里再讲) |
⭐&⭐^ ⭐|按位与按位异或 按位或
赋值操作符 |
⭐=⭐+=⭐-=⭐*=⭐/= ⭐&= ⭐^=⭐|=⭐>>= ⭐<<=(后五个涉及二进制的运算,学到这儿再讲)
单目操作符 |
⭐!⭐- ⭐+ ⭐&逻辑反操作负值 正值 取地址⭐sizeof 操作数的类型长度(以字节为单位)⭐~对一个数的二进制按位取反⭐--⭐++前置、后置-- 前置、后置++⭐* 间接访问操作符(解引用操作符)⭐(类型) 强制类型转换
关系操作符 |
⭐>⭐>=⭐<⭐<=⭐!= 用于测试“不相等”⭐== 用于测试“相等”
逻辑操作符 |
⭐&&逻辑与⭐||逻辑或
条件操作符 |
⭐exp1 ? exp2 : exp3
逗号表达式 |
⭐exp1, exp2, exp3, …expN
下标引用、函数调用和结构成员 |
⭐[] ⭐() ⭐. ⭐->
算术操作符
⭐+ ⭐- ⭐*就不介绍了,比较简单,就是你们理解的那样
我们来说一下⭐/和⭐%
int main(){int a = 7 / 2;//除int b = 7 % 2;//取模printf("%d\n", a);printf("%d\n", b);return 0;}
运行的结果:
3(应为变量a是整型,不会四舍五入,只会取小数点前面的整数)
1(取模就是取余数)
我们定义
a
是一个浮点型变量,/
左右的操作数必须要有一个是浮点型,或者都是浮点型,我们来看一下不是浮点型的情况
浮点型变量,整型操作数
int main(){float a = 7 / 2;//除int b = 7 % 2;//取模printf("%f\n", a);printf("%d\n", b);return 0;}
运行的结果:
3.000000(操作数没有一个是浮点型,就会导致3.500000变成3.000000)
1
浮点型变量,浮点型操作数
int main(){float a = 7 / 3.0;//除int b = 7 % 2;//取模printf("%f\n", a);printf("%d\n", b);return 0;}
运行的结果:
2.333333
1
如果要保留浮点型前几位,那就在
%f
中间加上.保留位数
例如%.2f
,保留两位
int main(){float a = 7 / 3.0;//除int b = 7 % 2;//取模printf("%.2f\n", a);printf("%d\n", b);return 0;}
运行的结果:
2.33
1
取模的操作数一个都不可以是浮点数,否则就会报错
int main(){float a = 7 / 2.0;//除float b = 7 % 2.0;//取模printf("%.2f\n", a);printf("%f\n", b);return 0;}
运行的结果:
赋值操作符
⭐=
int main(){int a = 0;//像这个创建一个变量的时候给它一个值叫做初始化a = 20;//赋值=return 0;}
⭐+=
⭐-=
int main(){int a = 0;int b = 5;//像这个创建一个变量的时候给它一个值叫做初始化a=a+3;a+=3;//就相当于a=a+3;a=a-3;a-=3;//就相当于a=a-3;return 0;}
单目操作符
a+b;+ //操作符有两个操作数的就是双目操作符 + a; +//操作符只有一个操作数的就是单目操作符
在c语言中,我们用
0
表示假,非0
表示真
!
就是把假变成真,把真变成假,就像下面这样
int main(){int flag = 0;//flag假if (!flag)//!flag真printf("真");elseprintf("假");return 0;}
运行的结果:
真
⭐-
负号
把符号颠倒,把正的变成负的,把负的变成正的
int main(){int a = -10; //只有一个操作数的就是单目操作符int b = -a; //只有一个操作数的就是单目操作符printf("%d", b);return 0;}
运行的结果:
10
⭐+
加号
+a与a是等同的,不会令负数变成一个正数
⭐sizeof
sizeof是操作符,是单目操作符,可以计算变量和类型所占内存的大小,单位是字节
int main(){int a = 10;printf("%zu\n", sizeof(a));printf("%zu\n", sizeof(int));return 0;}
运行的结果:
4
4
如果用来计算数组的大小,我们来看一下:
int main(){int arr[] = { 1,2,3,4,5 };printf("%zu\n", sizeof(arr));return 0;}
运行的结果:
很明显是4×5=20(在c语言中,是没有这些×÷符号的,要用c语言可以识别出来的符号*/)
也可以用这个
sizeof(arr)/sizeof(arr[0])
来计算数组中有几个元素
int main(){int a = 10;int arr[] = { 1,2,3,4,5 };printf("%zu\n", sizeof(arr) / sizeof(arr[0]));return 0;}
运行的结果:
20(数组占20个字节大小)
5 (数组里面有五个元素)
sizeof不是函数,所以也可以把
sizeof(a)
变成sizeof a
括号是可以省去的,这一点可以证明sizeof不是函数
但对于类型来说,括号是不可以省略掉的
⭐- -和⭐++
分前置和后置
i++;//后置++,先使用,后++++i;//后置++,先++,后使用i--;//后置++,先使用,后++--i;//后置++,先--,后使用
看一下下面的代码,小奔只举一个
++
的例子,或者自己动手操作一下
int main(){int a = 0;int b = a++;printf("一%d %d\n", a, b);//b先使用了a=0这个值,然后a再++变成1int c = ++a;printf("二%d %d\n", a, c);//a先++变成2,c再使用a=2这个值return 0;}
运行的结果:
一1 0
二2 2
⭐(类型)
int main(){//int a = 3.14;int a = (int)3.14;//3.14字面浮点数,编译器默认理解为double,我们用(int)来把它强制认为是int类型printf("%d", a);return 0;}
运行的结果:
3
关系操作符
关系操作符是用来判断关系的,举一个例子
a < 10;a <= 10;a == 10;
判断
a
与10
的关系,成立就是真,不成立就是假
在这里我们来说一下=
和==
两个的区别,非常容易错
int main(){int a = 10;if (a = 3)printf("%d", a);return 0;}
你认为它输出的结果是什么?
运行一下
结果是3
哎,你看到,你明明输入的a
是10
,为啥打印的是3
呢?
在这里小奔告诉你,=
是赋值操作符,是给变量一个值的作用,而==
是关系操作符,它才是判断是否相等的操作符
应该这样
int main(){int a = 10;//if (a = 3)if (a == 3)printf("%d", a);return 0;}
运行的结果:
可以看出来,a
不等于3
,所以为假,不执行if
下面的操作,也就是不打印a
的值
逻辑操作符
再来讲一下
&&
和||
的关系
哎,你有两只手,有一个桌子&&
,和一个椅子||
,桌子&&
要两只手才能搬动,椅子||
一只手就可以搬动
同理,
真&&
真,就是真
真&&
假,就是假
假&&
假,就是假真
||
真,就是真
真||
假,就是真
假||
假,就是假
写个代码试一下:
int main(){int a = 10;int b = 20;if (a <= 20 && b >= 10)printf("真");elseprintf("假");return 0;}
运行的结果:
真
其他的自己试一试,在这里就不写了
条件操作符
⭐exp1 ? exp2 : exp3
它有三个操作数,所以是三目操作符
它的意思是判断exp1
是否为真,是真的话输出exp2
的值,是假的话输出exp3
的值
举例来使用一下
int main(){int a = 10;int b = 20;//求最大值int r = a > b ? a : b;//a>b是假,输出b的值,所以r=b=20printf("%d", r);return 0;}
运行的结果:
20
int r = a > b ? a : b;
上面的代码就类似于下面的代码
if (a > b)r = a;elser = b;
逗号表达式
⭐exp1,exp2,exp3…expN
特点:从左到右依次计算,整个表达式的结果是最后一个表达式的结果
用法直接用代码来演示一下
int main(){int a = 10;int c = 0;int b = (a = a + 2, c = a - 3, c - 3);//b最后等于的是最后面的表达式//a = a + 2 = 12//c = a - 3 = 9//c - 3 = 6//b = 6printf("%d", b);return 0;}
运行的结果:
下标引用、函数调用和结构成员
⭐[ ]
在代码里面解释
int main(){int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };//定义数组大小的时候是不可以在[]里用变量的arr[5];//[]就是下标引用操作符//arr和5都是操作数int n = 5;arr[n];//这里是可以用变量的//这里的n是来访问下标是n的元素,在定义数组大小的时候是不可以用变量的return 0;}
⭐()
函数调用操作符
int Add(int x){return x + 5;}int main(){int a = 10;a = Add(a);//()函数调用操作符,Add,a都是()的操作数//sizeof的()是可以省掉的,所以它不是函数//函数是不可以省去()printf("%d", a);return 0;}
今天结束了,写了两天,太多了,下一篇介绍关键字