大多数编程语言都是以处理数据为中心的,无论什么语言对数据做处理,运算符都是必不可少的,下面我们来看一下C语言中的运算符都有哪些。
运算符
运算符有很多,我们可以按照其类别的方式去记忆他们,这样相对简单一些,不过也不必刻意记忆,这些我们平时用的多了自然就记住了。那接下来我们先进行分个类。
赋值运算符: =
算术运算符: =、-、*
关系运算符: <、>、>=、<=、==、!=
逻辑运算符: !、&&、|
位运算符 : ~、&、|、<<、>>、^
逗号运算符: ,
求大小运算符: sizeof
- 单目运算符:例如负号(-),取地址符
- 双目运算符:例如加号(+),大于号(>)
- 三目运算符:只有一个就是
?
这只是运算符中的一部分,剩下的我们后续慢慢了解。
赋值运算符
基本使用:
赋值符号"="就是复制运算符,而不是表示相等的意思。
通用形式:
变量名 = 表达式;
我们需要注意的是,赋值号左边的是一个可以被赋值的变量,右边是要赋给它的值,所以
int a = 100;10 = a;
是错的。
我们来几个例子:
int Num = 100;
int Num1 = 0;
Num1 = Num; //这里我们就把Num的值赋值给了Num1
连续赋值:
int a,b,c;
c = 10;
a = b = c;
//这里先将c的值赋给b,然后将b的值赋值给a
算术运算符
一元运算符:-(符号)、++(自增)、--(自减)
二元运算符:+(加)、-(减)、*(乘)、/(除)、%(取模)
我们首先介绍一下二元运算符,二元运算符都是我们常见的运算符,但是有两个符号我们在这里多啰嗦两句。
"/":-13.2 得到的结果是-6
15/3.0 得到的结果是5.0 10/-4.0 得到的结果是-2.5
规则: 1.整数相除,结果只能得到整数部分。
2.要想得到小数部分,运算需要浮点数的参与。 3.运算结果的符号余除数与被除数有关系。
"%":-13%2 得到的结果是-1
13%-2 得到的结果是1
规则:1.取模运算符的两个操作数必须是整数,不能是浮点数
2.运算结果的符号仅与被除数有关。
接下来是自增(++),自减(--)运算符:
当自增的同时还参与运算的时候,++放后面,会先参与运算,再自增。
当自增的同时还参与运算的时候,++放前面,会先自增,再参与运算。
自减规律和自增相同
int main()
{
int Num = 10;
int Num = 0;
Num2 = Num++; //先赋值,再自增。
printf("%d\n",Num2);
Num2 = ++Num; //先自增,再赋值
printf("%d\n",Num2);
return 0;
}
结果是:10,12。
赋值运算与算术运算连用
赋值运算符于算术运算符可以连用,成为符合运算:
+=
,a+=1
相当于a=a+1
-=
,a-=1
相当于a=a-1
*=
,a*=1
相当于a=a*1
/=
,a/=1
相当于a=a/1
%=
,a%=1
相当于a=a%1
- ...
一些不太明显运算我们来解释一下例如
int a = 100;
int b = 20;
a /= b+10;
//这里最后会变形为a = a/(b+10);优先运算=右边的。
逗号运算符
逗号运算符一般没有太大作用,就是起到了一个分割的作用。
我们需要了解的是逗号运算符的优先级最低以及以下一个例子
int a = 0,b = 0;
a = 1,2,3,4,5;
b = (6,7,8,9);
//最终的结果是a是1,b是9
sizeof运算符
sizeof运算符是个特殊的运算符,他能够得到某一特数据或者数据类型所占用的内存大小(以字节为单位)。
因为能够得到某一个数据或者数据类型的大小,所以sizeof中可以写数据类型,也可以写变量名。
int main()
{
int nNum = 0;
char cCha = 0;
double fNum = 0;
printf("int 型占用的大小为:%d\n",sizeof(int));
printf("nNum 型占用的大小为:%d\n",sizeof(nNum));
printf("char 型占用的大小为:%d\n",sizeof(char));
printf("cCha 型占用的大小为:%d\n",sizeof(cCha));
printf("double 型占用的大小为:%d\n",sizeof(double));
printf("fNum 型占用的大小为:%d\n",sizeof(fNum));
return 0;
}
最后结果是:int 4 ,nNum 4,char 1,cCha 1,double 8,fNum 8;
表达式
C语言中的表达式,是若干个运算符于数据合在一起的算式,例如:100,10+5,a+10,(a*100+1)/2,a=0
无论是简单的式子,还是复杂的式子,表达式组中都是有一个值的,以下是常见的简单表达式,他们组成的复杂运算的基础。
- 常量表达式:
100
,单个常量也是表达式 - 赋值表达式:
a = 10
,等号左边必须是一个可修改的值 - 算术表达式:
a += 10
,先运算a+10,然后将结果赋值给a - 关系表达式:
a>b
,判断a和b的大小关系 - 逻辑表达式:
a&&b
,这个计算结果只可能是1或0 - 函数表达式:
fun()
,得到函数的返回值
一个式子中有多个运算符,那么可以称之为符合表达式,例如(100+a*100)/2>10
。
语句
语句是C语言的基本组成单位,语句的结尾用一个分号标识,一个表达式加上一个分号就是一个语句,表达式也有可能是语句的一部分。
int main()
{
int b;
scanf_s("%d",&a);
if(a>0)
{
b = a%10;
printf("你输入了一个大于0的数,它的个位是%d",b);
}
return 0;
}
这例子中,if后面的两条语句称之为符合语句,当然main函数下面在大括号之间的也是复合语句。
类型转换
自动类型转换
自动类型转换的情况有两种:
1.当一个算术表达式中为不同类型的变量的时候,会进行自动类型转换。char -> short -> int -> long -> float -> double
2.进行赋值运算的时候,会将右值类型自动转换为左值,有可能会都是数据。
int i = 10;
float c = 2.5;
i = i/c;
//i/c为4.000,i先自动转成float进行计算,结果再转成"="左侧的类型。最终i的值是4。
强制类型转换
通过使用转换可以将一个表达式强制转换为某一种类型,语法是:(变量类型)变量
float b = 13.44;
int a = (int)b;
//将float类型强转为int类型
运算符的优先级与结合性
在一个表达式中,不可避免的会出现多个运算符,先计算那个是我们需要关注的问题,因为数学计算中,先后顺序对结果的影响非常大,在我们刚接触数学的时候,我们就知道先乘除,后加减,在C语言中也有类似规则,这个规则称为优先级。
一个表达式中,先计算优先级高的运算符,然后计算优先级的运算符。
如果遇到了相同优先级的情况,这个时候还会有个结合性。
例如:-8*4%2-3
- 一元运算符优先级最高 -8
- *与%优先级相同,因为是做结合的,所以先计算 -84=-32
- -32%2 = 0
- 0-3 = -3
在比如:
1+2+3,我们先计算1+2然后得到的结果再加3
b=c=10,这个式子中,先计算c=10,然后对b赋值
但其实我们,一般我们不需要大量时间去记忆优先级问题,如果我们以后写的时候遇到这个问题,我们以直接使用括号搞定,但使用括号的时候我们需要注意:
- 先计算括号内的内容
- 在括号中嵌套括号(()),这样的情况,最里层最先执行
- 包含多个括号的表达式从左向右进行计算
最后我们强调一点:括号的优先级最高,逗号的优先级最低。