1.运算符
1.1算数运算符:加,减,乘,除,取余,对应的符号:+,-,*,/,%
<1>.如果参与除法计算的两个数字是整型数则计算结果只保留整数部分
例如:5/2=2
<2>./和%不能对整数0进行操作,否则程序崩溃
例如:5/0, 5%0
<3>.%不能对浮点数使用
例如:5%1.1,否则程序崩溃
<4>.%的结果与其左边的数字符号一致
例如:-7%2=-1 7%-2=1
<5>./如果除数为浮点数,最后得到inf无穷大
例如:5/0.0
1.2赋值运算符:=,就是将右边的值给左边的变量,也就是将变量对应的内存数字进行改变
形式1:
int a;
a = 10
形式2:
int a, b, c;
a = b = c = 10;
printf("%d %d %\n", a, b, c); //10 10 10
形式3:复合运算符:赋值运算符和其他运算符结合起来使用
例如:
a += b; //等价于a = a + b;
a -= b; //等价于a = a - b;
a *= b; //等价于a = a * b;
a /= b; //等价于a = a/b;
a %=b; //等价于a = a%b;
注意实现:不能给常量(不可改变的数字)和表达式赋值:
100 = 200; //gcc报错
100 = a; //gcc报错
a+b = c; //gcc报错
1.3自增运算符(++)和自减运算符(--)
<1>.定义
自增运算符就是让变量对应的内存数值加1
自减运算符就是让变量对应的内存数值减1
<2>.四种形式:
前++:先对变量的值加1,后计算表达式的值
例如:
int a = 1;
int b = 0;
b = ++a;
printf("a = %d, b = %d\n", a, b); //a = 2, b = 2
后++:先计算表达式的值,后对变量的值加1
例如:
int a = 1;
int b = 0;
b = a++;
printf("a = %d, b = %d\n", a, b); //a = 2, b = 1
前--:先对变量的值减1,后计算表达式的值
例如:
int a = 2;
int b = 0;
b = --a;
printf("a = %d, b = %d\n", a, b); //a = 1, b = 1
后--:先计算表达式的值,后对变量的值减1
例如:
int a = 2;
int b = 0;
b = a--;
printf("a = %d, b = %d\n", a, b); //a = 1, b = 2
<3>.不要对常量进行自增自减运算
100++; //报错
++100; //报错
1.4关系运算符:
==等于/!=不等于/>大于/<小于/>=大于等于/<=小于等于
注意:
<1>.关系运算符的运算结果是整数:1(真)或者0(假)
<2>.不要进行以下类似的逻辑判断(连续的逻辑判断)
例如:8<7<5,结果总是为1(真)
因为先算8<7,结果为0,而0有小于5,结果为1
1.5逻辑运算符
<1>.明确:计算机中的真就是非0(包括1),0就是假
逻辑运算符作用:实现计算机程序中的逻辑判断
例如:当用户名和密码都对了,才能登陆
登陆方式可以是微信或者手机号后者抖音号等
<2>.逻辑运算符类型:三类
1.逻辑与: &&(并且,与此同时的意思)
2.逻辑或: ||(或者的意思)
3.逻辑非: !(对着干的意思)
<3>.逻辑与&&运算符特点
使用语法:C=表达式A && 表达式B
语义:只有当A和B的值都为真(非0),整个表达式C的值才为真
只要有一个为假,整个表达式C的值都为假
例如:1 && 1; //真
0 && 1; //假
1 && 0; //假
0 && 0; //假
<4>.逻辑或||运算符特点
使用语法:C=表达式A || 表达式B
语义:只要A和B中有一个为真,整个表达式C的值都为真
只有当A和B都是假,结果才能是假
例如:0 || 0; //假
1 || 0; //真
0 || 1; //真
1 || 1; //真
<5>.逻辑非运算符特点
使用语法:!表达式A
语义:A假结果为真,A真结果为假
例如:
!1;//结果为假
!0;//结果为真
<6>.切记:短路运算(笔试题必考)
形式1.A && B:如果A的值为假,则B不处理,B的代码不执行
例如:
int a = 1;
0 && ++a;
printf("a = %d\n", a); //a=1
int b = 1;
250 && ++b;
printf("b = %d\n", b); //b=2
形式2.A || B: 如果A的值为真,则B不处理,B的代码不执行
例如:
int a = 1;
0 || ++a;
printf("a = %d\n", a); //a=2
int b = 1;
250 || ++b;
printf("b = %d\n", b); //b=1
1.6位(bit)运算符
<1>.计算机中所有的数据(数字)都是内存中,并且都是以二进制的形式存放(1或者0,bit位)而8,10,16进制仅仅是对二进制数的一种人为的友好表示形式(给人看的)
<2>.位运算符作用:位运算就是对内存中的二进制数进行运算,并且C语言专门提供对应的运算符,简称位运算符
<3>.位运算符四种形式:
位与:&(清0)
位或 : |(置1)
位异或: ^(反转)
位反: ~(取反)
<4>.位与运算符特点:
语法:C = A & B;
例如:
A: 01011010 0x5a
B: 11100011 0xe3
&-------------------
C: 01000010 0x42
规律:任何数跟0做位与,结果为0,任何数跟1做位与,保持原值
切记切记切记应用场合:一般用于将某个数的某个bit位清0,并且保持其他位不变
例如:将0x5a这个数的第3位清0: 0x5a & 0xf7
76543210 二进制编号
A:0x5a 01011010
B : 0xf7 11110111
C: 0x52 01010010
例如:将0x5a这个数的第3位和第4位清0: 0x5a & 0xE7
76543210 二进制编号
A:0x5a 01011010
B : 0xE7 11100111
C: 0x42 01000010
位或运算符特点
语法格式:C = A | B;
例如:
A: 01011010 0x5a
B: 11100011 0xe3
|-------------------
C: 11111011 0xfb
规律:任何数跟1做位或,结果为1,任何数跟0做位或,保持原值
切记切记切记应用场合:一般用于将某个数的某个bit位置1,并且保持其他位不变
例如:将0x5a这个数的第2位置1: 0x5a | 0x04
76543210 二进制编号
A:0x5a 01011010
B : 0x04 00000100
C: 0x5e 01011110
例如:将0x5a这个数的第1,2位置1: 0x5a | 0x06
76543210 二进制编号
A:0x5a 01011010
B : 0x06 00000110
C: 0x5e 01011110
位异或符运算特点:^
1.语法:C = A ^ B;
例如:
A: 01011010 0x5a
B: 11100011 0xe3
^-------------------
C: 10111001 0xb9
2.规律:相同为0,不同为1,应用于取反场合
位反运算符特点:~
1.语法:C=~A;
例如:
A: 01011010 0x5a
~A:10100101 0xa5
2.规律:0变1,1变0
3.注意:位反(~)运算符一般和位与(&)结合起来实现将某个数的某个bit清0操作
例如:
1.7移位运算符
<1>.功能:就是将二进制数统一向左或者向右移动n个位置(简称左移,右移)
<2>.移位运算符种类:两种
左移:A<
语义:将A左移B个位置
右移 : A>>B
语义:将A右移B个位置
例如:
1 << 3:将1左移3位
3 >> 1:将3右移1位
<3>.移位运算符特点:
1.向左移动后右边空出来的数据用0来填充
例如:A数据前提是char类型
A=0x5A = 01011010
A << 2 = 01011010 << 2 结果为: 01101000 = 0x68
2. 无符号类型数字右移时左边空出来的数据用0来填充
例如:01011010 >> 2 结果为:00010110 = 0x16
3.有符号类型数字右移时左边空出来的数据用符号位填充
例如:10100101(前提是char类型) >> 2 结果为: 11101001 = 0xE9
4.左移n位相当于乘以2的n次方
5.右移n位相当于除以2的n次方
6.如果程序中将来涉及乘或者除2的n次方运算,务必用左移或者右移用*或者/的执行效率相当低下!
例如:
int a = 1;
int b = a * 4; //垃圾代码
int b = a << 2; //高薪代码
3.不管是位运算符(&,|,^,~)还是左移,右移他们都不会改变变量本身的值
例如:
int a = 3;
int b = a << 1;
printf("a = %d, b = %d\n", a, b); //a = 3, b = 6
1.8取地址运算符&和解引用运算符*
<1>.明确地址特性:计算机中地址由32位二进制数组成,也就是一个地址32位,4字节
<2>.取地址运算符&作用:获取一个变量在内存对应的首地址,占位符%p用来显示地址信息
<3>.取地址运算符&使用语法格式:&变量名;
例如:
int a = 250; //分配4字节内存空间并且放一个250数字
printf("变量a的首地址为%p\n", &a);
<4>.解引用运算符*作用:根据变量的首地址获取内存中的数据
或者根据变量的首地址向内存写入新数据
<5>.解引用运算符*语法是:*地址 结果可以操作内存了
例如:
int a = 250;
printf("a的首地址%p\n", &a);
printf("a的值是%d\n", *&a); //通过地址获取变量的值
*&a = 520; //根据变量a的地址找到a的内存,然后向内 存写入一个新数520
1.9条件运算符(又称三目运算符)
a)语法格式:整个表达式结果D = 条件表达式A ? 表达示B : 表达式C
语义:如果A为真,D=表达式B的运算结果,否则D=表达式C的运算结果
例如:
int a = 1 ? 2 : 3; //a=2
1.10注意运算符的优先级
例如:
printf("%d\n", 2+3*2); //8
printf("%d\n", (2+3)*2); //10
结论:()它的优先级最高,不嫌多
例如:
int a;
a = 1 > 2 && 2 < 3;
等价于:
a = (1 > 2) && (2 << 3);