C语言运算符是说明特定操作的符号,它是构造C语言表达式的工具。C语言的运算异常丰富,除了控制语句和输入输出以外的几乎所有的基本操作都为运算符处理。除了常见的三大类,算术运算符、关系运算符与逻辑运算符之外,还有一些用于完成特殊任务的运算符,比如位运算符。
操作符 的分类大致如下图划分:
下面 ,来简单介绍一下这些操作符:
一、算术操作符
算术操作符 + - * / %
前四种大家很熟悉,值得一提的就是 **%**为取模运算,也称求余,顾名思义,即为求余数的运算,例如数学中“ 11 除以 2 等于 5 余 1 ”,在c语言中可以表示为: 11/2=5,11%2=1
注意:
1、除%操作符外,其他的几个操作符可以作用于整数和浮点数。而%操作符的两边必须为整数,返回的是整除之后的余数
2、/ 操作符中,若除数与被除数都是整数,则进行整数除法。若有一方数据为浮点数类型,需将另一方数据也转化为浮点数类型,从而进行浮点数除法
二、移位操作符
<< 左移操作符
>>右移操作符
左移操作符是将某数的二进制全部向左移动,移动的位数由右操作数指定(不可为负数),高位左移溢出后舍弃,在低位补0
如:int i=1; ------->000…0001
i<<1; 左移后的结果为2 ------->000…0010
i<<2;左移后的结果为4 ------->000…0100
i<<3;左移后的结果为8 ------->000…1000
…
左移一位相当于X 2(乘以进制),左移两位相当于X 2^2(进制的平方)…
由此,又可得出结论,对于无符号的数i(为m进制)左移n位,结果为i*(m^n) ,但是,该方法只适用于高位或者说将要舍弃的位不存在 1 的情况
总之,左移操作符对于大多数情况适用的就是:丢弃最高位 ,0补最低位
右移操作符:右移和左移相反,其规则分为两种
1、逻辑右移:高位补0,低位丢弃
2、算术右移:高位用原符号位代替,低位丢弃
——————————
实际中可以用左移右移进行快速的乘除运算
位操作符
& //按位与------->同时为真时成立
| //按位或------->有一个为真时即成立
^ //按位异或------->相同为假,不同为真
这块较为简单,不过需要注意的是区分为操作符与逻辑操作符。
赋值操作符
= //赋值操作符
可以说赋值操作符在各种语言中可以称之为最常用的操作符之一,它可以连续使用
复合赋值符
+= //---------------->例如:x+=10 意为x=x+10
-= //---------------->例如:x-=10 意为x=x-10…下面同理
*=
/=
%=
<<=
>>=
&=
|=
^=
同样,需要注意的是与逻辑操作符“==”之间的区分。
单目操作符
单目运算符是指运算所需变量为一个的运算符,即在运算当中只有一个操作数,又叫一元运算符
! //逻辑反操作
- //负值
+ //正值
& //取地址
sizeof //操作数的类型长度(以字节为单位)or 求变量(类型)所占空间大小
~ //对于一个数的二进制按位取反
- - //自减 前置的话,刑如:i - -,表示先用后减,先参加运算,然后自身-1;- -i,表示先减后用,先自身-1,然后再参加运算
+ + //自增,形同自减
* //间接访问操作符(解引用操作符)
(类型) //强制类型转换
关系操作符
<
>
>=
<=
!= //用于测试“不相等”
== //用于测试“相等”
需要注意的是使用时的一些陷阱
例如:
int number=1;
if(number==1){ //需要注意:不可将“==”误写为“=”,否则计算机执行时会认为if语句括号内是先赋值后判断,这样的话将会永远输出“...”!这样的错误在大型程序中是致命的,特别难以找到
print("..."); //建议,将常亮写在操作符左边,这样的话,即使写成“=”,编译时就会报错
}
else{
print(",,,");
}
逻辑操作符
&& //逻辑与
| | //逻辑或
在此处,需要区分逻辑与和按位与,区分逻辑或与按位或,从某种角度可以理解为,逻辑操作符是在“宏观”的基础上进行操作,按位操作符是在“微观”基础上进行操作的。
例:
#include<stdio.h>
int main()
{
int i = 0, a = 0, b = 2, c = 3, d = 4;
i = a++&&++b&&d++; //1式运行后的答案是a=1 b=2 c=3 d=4
//i = a++||++b||d++; //2式运行后的答案是a=1 b=3 c=3 d=4
printf("%d %d %d %d\n", a, b, c, d);
return 0;
}
估计会有不少朋友问为什么?
在1式中,用逻辑与进行连接三个式子然后进行赋值,逻辑与要求各个式子必须全部成立才为真,那么当检测到a=0时,已经得出了结果,不成立,不管后面是什么式子,已经不成立了,后面的计算机默认不会执行,所以只有a++被执行了,后面的式子都未被执行
在2式中,与1式同理,但是逻辑或要求只要有一个成立即为真,所以当执行到++b时,整个式子已经成立,后面的已经不需要执行,所以,在2式中,执行了a++和++b两个式子
条件操作符
exp1 ? exp2 : exp3
简言之,该式子可以与 if…else…语句进行替换
例如:
#include<stdio.h>
int main()
{
int a = 1;
int b = 2;
int c;
// c = a > b ? a : b;
if (a > b){
c = a;
}
else{
c = b;
}
printf("%d", c);
return 0;
}
逗号表达式
exp1 , exp2 , exp3 , …
逗号表达式,就是用逗号隔开的多个表达式。逗号表达式,从左向右依次执行,整个表达式的结果就是最后一个表达式的结果。
int a=1;
int b=2;
int c=(a>b, a=b+10, a, b=a+1); //a=12 b=13
printf("%d",c); //c=13
下标引用、函数调用和结构成员
下标引用操作符[ ]
其操作数为一个数组名和一个索引值,如:arr[0]中,操作数位arr和0,其通常多用在数组中
函数调用操作符()
接受一个或者多个操作数:第一个为函数名,剩余的操作数为传递给函数的参数,其通常用在函数调用中
访问一个结构的成员
. 用于:结构体 . 成员名
-> 用于:结构体指针 -> 成员名
附:c语言操作符优先级顺序
那么,掌握了这些之后,就可以编写一些简单的程序了…