目录
一.操作符是什么?
基本特征
语义
优先级
结合性
二.操作符的分类
三.操作符各类详解
1.算数操作符(+-*/%)
(1)优先级:
(2)除法操作符(/)的计算规则及注意事项
(3)取余操作符(%)的计算规则
(4)算术操作符示例代码
2.移位操作符(>> <<)
(1)优先级:
(2)计算规则及注意事项
(3)移位操作符示例代码
3. 位操作符(& ^ |)
(1)优先级
(2)计算规则及注意事项
(3)面试例题
(4)位操作符示例代码
4.赋值操作符( = += -=*= /= %= ………)
(1)优先级(赋值操作符的优先级都很低)
(2)运算规则
(3)赋值操作符示例代码
5.单目操作符
(1)单目操作符的介绍
(2)单目操作符有哪些?
(3)sizeof和数组
(4)sizeof与数组示例代码:
6.关系操作符(=)
(1)优先级
(2)关系操作符的介绍
(3)运算结果值
(4)注意事项
(5)示例代码
7.逻辑操作符(&& ||)
(1)什么是逻辑操作符?
(2)优先级
(3)计算规则
(4)计算机在计算时的特点:
(4)例题
8.条件操作符( :? )
(1)优先级
(2)运算规则:
(3)代码示例
9.逗号表达式( , )
(1)优先级
(2)逗号表达式的介绍及运算规则
例题:
10.下标引用,函数调用和结构体成员 ([ ] () . -> )
(1)优先级
(2)下标引用操作符( [ ])
(3)函数调用操作符( ( ) )
(4)结构体成员访问操作符( ->. )
四.操作符优先级表(含记忆规律)
1.运算符优先级和结合性一览表
2.表中规律:
一.操作符是什么?
指令系统的每一条指令都有一个操作符,它表示该指令应进行什么性质的操作。不同的指令用操作符这个字段的不同编码来表示,每一种编码代表一种指令。
基本特征
语义
每个操作符都有自己的语义,具体取决于它所操作的类型。
优先级
每个操作符都有优先级。
结合性
每个操作符都有结合性。操作符的结合性定义了操作符对操作数执行操作的顺序,例如:右结合性表示该操作符对其操作数从右向左执行操作。
二.操作符的分类
算数操作符 | + – * /% |
移位操作符 | <> |
位操作符 | & |^ |
赋值操作符 | = += -=*=/= …… |
单目操作符 | ! sizeof+ – ~&* …… |
关系操作符 | >= <= != |
逻辑操作符 | && || |
条件操作符 | ? : |
逗号表达式 | , |
下标引用,函数调用和结构体成员 | [ ] () . -> |
三.操作符各类详解
1.算数操作符(+-*/%)
(1)优先级:
(2)除法操作符(/)的计算规则及注意事项
这里重点要讲的是除法的计算
2.1除法计算分类
(1)整数除法 (除号两端都是整数)
(2)浮点数除法 (两端有一个是小数就执行浮点数除法)
2.2计算规则及注意事项
注:除法中,被除数不能等于0
整数除法的结果只保留了整数部分,小数点后的直接舍去如 15 / 5 =3 3 / 2 =1
注意:这里不是四舍五入,是将小数部分直接舍去哦!
浮点数除法的结果整数和小数部分都保留,结果精度一般是小数点后6位
例如3 / 2.0 =1.500000
3.0 / 2 = 1.500000
3.0 / 2.0 = 1.500000
注意:两端至少有一个为小数即可
(3)取余操作符(%)的计算规则
注:取余操作符的两端都必须为整数
3.1计算规则:
例如5 % 2 = 1(5除2等于2余数为1)
99 % 10 = 9
(4)算术操作符示例代码
int main(){printf("%d\n",3+5);printf("%d\n",4-2);printf("%d\n",5*7);printf("%d\n",15/5);printf("%d\n",3/2);printf("%d\n",99%10);return 0;}
输出:
2.移位操作符(>> <<)
(1)优先级:
(2)计算规则及注意事项
注意:移位操作符的操作数只能是整数
2.1计算规则
首先,移位操作符移动的是操作数的补码二进制信息
(1)右移操作符
右移操作符运算及示例:
注意:移位操作符操作数本身不会发生改变 ;例如上述的 b = a>>1
其中b=7 ;而a 本身还是 15
2.2左移操作符
计算规则:左边丢弃,右边补0
(3)移位操作符示例代码
int main(){int a = 15;int b = -15;int c = 6;int m = -6;int d = a >> 1;int e = b >> 1;int f = c << 1;int g = m << 1;printf("%d %d %d %d \n",d,e,f,g);return 0;}
输出:
3. 位操作符(& ^ |)
注意:和移位操作符一样,也是操作二进制的补码
(1)优先级
(2)计算规则及注意事项
注意:他们的操作数必须是整数
(1)按位与&
计算规则
两个数对应的二进制有0则为0,全1才为1;
(2)按位异或(^)
计算规则
两个数对应的二进制位相同为0,相异为1;
常见结论:a^0=a;
a^a=0;
a^b^a=b; (支持交换律)
a^a^b=b;
(3)面试例题
题目描述:不创建临时变量交换a,b的值
参考代码:
#include int main(){int a = 10;int b = 20;printf("交换前:a = %d b = %d\n", a,b);a = a^b;b = a^b;a = a^b;printf("交换后:a = %d b = %d\n", a,b);return 0;}
(3)按位或 ( | )
计算规则
两个数对应的二进制有1则为1,全0才为0;
(4)位操作符示例代码
int main(){int a = 3;int b = -5;printf("a=%d b=%d\n",a,b);printf("a&b=%d\n",a&b);printf("a|b=%d\n",a|b);printf("a^b=%d\n",a^b);printf("a^a=%d\n",a^a);printf("a^0=%d\n",a^0);printf("a^b^a=%d\n",a^b^a);printf("a^a^b=%d\n",a^a^b);return 0;}
输出
4.赋值操作符( = += -=*= /= %= ………)
(1)优先级(赋值操作符的优先级都很低)
(2)运算规则
他们的运算规则基本相同;
符号 | 运算规则 |
a=3 | 3赋给a |
a+=3 | a=a+3 |
a-=3 | a=a-3 |
a*3 | a=a*3 |
a/=3 | a=a/3 |
a%=3 | a=a%3 |
a<<=3 | a=a<<3 |
a>>=3 | a=a>>3 |
a&=3 | a=a&3 |
a|=3 | a=a|3 |
a^=3 | a=a^3 |
(3)赋值操作符示例代码
int main(){int a = 9;printf("a=%d\n",a);printf("a+=3的值为%d\n",a+=3);printf("a-=3的值为%d\n",a-=3);printf("a*=3的值为%d\n",a*=3);printf("a/=3的值为%d\n",a/=3);printf("a%=2的值为%d\n",a%=2);printf("a|=5的值为%d\n",a|=5);printf("a&=3的值为%d\n",a&3);printf("a^=2的值为%d\n",a^2);printf("a<<=1的值为%d\n",a<>=1的值为%d\n",a>>=1);return 0;}
输出:
5.单目操作符
(1)单目操作符的介绍
单目操作符:只有一个操作数
(2)单目操作符有哪些?
! | 逻辑反操作 |
– | 负值 |
+ | 正值 |
& | 取地址 |
sizeof | 操作数的类型长度(以字节为单位) |
~ | 对一个数的二进制按位取反 |
— | 前置,后置– |
++ | 前置,后++ |
* | 间接访问操作符(解引用) |
(类型) | 强制类型转换 |
注意:sizeof不是函数,是操作符
计算的是类型创建的大小(单位字节)
(3)sizeof和数组
(4)sizeof与数组示例代码:
int main(){int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };char ch[6] = { 'a','b','c','d','e','f' };int a = sizeof(arr);//40int b = sizeof(ch); //6printf("int类型的大小%d\n",sizeof(int)); //4printf("char类型的大小%d\n",sizeof(char)); //1printf("数组arr的大小%d\n",a); //40printf("数组ch的大小%d\n",b);//6return 0;}
输出:
6.关系操作符(=)
(1)优先级
(2)关系操作符的介绍
(3)运算结果值
关系运算符的值只能是0或1。
关系运算符的值为真时,结果值都为1。
关系运算符的值为假时,结果值都为0。
(4)注意事项
(1)前4种关系运算符的优先级别相同,后两种也相同。前四种高于后两种。
(2)关系运算符的优先级低于算术操作符。
(3)关系运算符的优先级高于赋值运算符。
(5)示例代码
int main(){printf("%d\n",(-3>2));printf("%d\n",(3>=3));printf("%d\n",(2)&&(-1));printf("%d\n",(2<=9));printf("%d\n",(4<=4));return 0;}
输出:
7.逻辑操作符(&& ||)
(1)什么是逻辑操作符?
逻辑操作符是用于结合bool值测试复合条件的操作符。
(2)优先级
(3)计算规则
逻辑与&&:()&&() 两个全为为真才为真,其中一个为假即为假;
逻辑或 | :()|()两个为假才为假,其中一个为真即为真;
注意:(非0为真,0为假)
(4)计算机在计算时的特点:
1.为真电脑计算的结果为1,为假计算的结果为0;
例如:int a = (3>4) a的结果为0;a=0;
int a = (3>2)a的结果为1;a=1;
2..当&&操作符左边的为假,右边的都不用计算了;
(因为&&操作符有一个为假即为假)
例如 (33)左边条件为假 ,右边就不用算了,整个式子的结果就是假;
3..当||操作符左边为真,右边也不用计算了;
(因为||操作符其中一个为真即为真)
例如 (3>2)||(4<9)左边条件为真,右边就不用计算了,整个式子的结果就为真;
(4)例题
1.题目描述:printf(“%d”,(a=2)&&(b=-2));的输出结果()
答案:1
2.题目描述:int x=3,y=4,z=1;则表!(x+y)+z-1&&y+z/2的值为()
答案:0
解析:因为式子中运算符的优先级为 ()> ! > / > +
所以左边的式子x+y=7(非0,为真),但是运算符!,结果变为假,所以结果为0;
0+z-1=0;左边为0,又因为是&&操作符,所以整个式子结果为假,即为0;
代码测试
int main(){int a = 0;int b = 0;int x = 3;int y = 4;int z = 1;printf("%d\n",(a=2)&&(b=-2));printf("%d\n",!(x+y)+z-1&&y+z/2);return 0;}
输出:
8.条件操作符( :” />(1)优先级
(2)运算规则:
表达式为:表达式1:表达式2:表达式3
先计算表达式1的值,若表达式1为真,则执行表达式2;若表达式1为假,则执行表达式3;
例如;
max = (x > y) ” />min = (x < y) ? x :y (就是把x,y中较小的赋给min)
(3)代码示例
int main(){int x = 4;int y = 3;int a = 2;int b = 6;int max = ((x > y) ? x : y);int min = ((a < b) ? a : b);printf("x=%d y=%d a=%d b=%d\n",x,y,a,b);printf("max=%d\n",max);printf("min=%d\n",min);return 0;}
输出:
9.逗号表达式( , )
(1)优先级
逗号表达式的优先级最低
(2)逗号表达式的介绍及运算规则
逗号表达式,是c语言中的逗号运算符,优先级别最低,它将两个及其以上的式子联接起来,从左往右逐个计算表达式,整个表达式的值为最后一个表达式的值。
如:(3+5,6+8)称为逗号表达式,其求解过程先表达式1,后表达式2,整个表达式值是表达式2的值,如:(3+5,6+8)的值是14;a=(a=3*5,a*4)的值是60,其中(a=3*5,a*4)的值是60, a的值在逗号表达式里一直是15,最后被逗号表达式赋值为60,a的值最终为60。
例题:
例题:(a = 3,b = 5,b+ = a,c = b* 5),求逗号表达式的值?
答案:40
解析:前两个表达式只是赋值,从第三个开始计算,b+=a,即b=b+a,即b=5+3,b=8,求最后一个表达式,c=b*5=8*5=40.因为逗号表达式的值是最后一个表达式的值,所以整个逗号表达式的值为40,其他各变量最后的值依次为:a=3,b=8,c=40
10.下标引用,函数调用和结构体成员 ([ ] () . -> )
(1)优先级
(2)下标引用操作符( [ ])
操作数:一个数组名+一个引索值
如:
arr[10]={0};//创建数组
arr[9]=10;//使用下标引用操作符
[ ]的两个操作数是arr和9
(3)函数调用操作符( ( ) )
1.操作数
函数名 + 函数参数
如 strlen(”abc”) 操作数为strlen”abc”
注意:函数的参数可能有多个,所以对于函数调用操作符()来说,操作数至少有1个(函数可以没有参数,如:test());
2.示例代码
#include void test(){printf("hello bit!");}int main(){char ch[] = "abc";int len = strlen(ch);printf("%d\n",len);test();return 0;}
(4)结构体成员访问操作符( ->. )
. 结构体变量.成员名
->结构体指针->成员名
示例代码
struct book{charname[20];charauthor[20];float price;};void Print(struct book * p){printf("%s %s %.1f\n",p->author,p->name,p->price);}int main(){structbook a = { "小明","c语言",33.9f };Print(&a);printf("%s %s %.1f",a.author,a.name,a.price);return 0;}
输出:
四.操作符优先级表(含记忆规律)
1.运算符优先级和结合性一览表
2.表中规律:
- 结合方向只有三个是从右往左,其余都是从左往右。
- 所有双目运算符中只有赋值运算符的结合方向是从右往左。
- 另外两个从右往左结合的运算符也很好记,因为它们很特殊:一个是单目运算符,一个是三目运算符。
- C语言中有且只有一个三目运算符。
- 逗号运算符的优先级最低,要记住。
- 此外要记住,对于优先级:算术运算符 > 关系运算符 > 逻辑运算符 > 赋值运算符。逻辑运算符中“逻辑非 !”除外。
谢谢观看!!!