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;

判断a10的关系,成立就是真,不成立就是假
在这里我们来说一下===两个的区别,非常容易错

int main(){int a = 10;if (a = 3)printf("%d", a);return 0;}

你认为它输出的结果是什么?
运行一下
结果是3

哎,你看到,你明明输入的a10,为啥打印的是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;}

今天结束了,写了两天,太多了,下一篇介绍关键字