运算符
算术运算符
结果:数值
+、-、*、\、%、+(正)、-(负)、++、--
i++和++i
相同点:i自身都会增1
不同点:它们运算的最终结果是不同的。i++:先使用,后计算;++i:先计算,后使用
举例:
//i++
int a = 1;
int b = a++;//运算数在前,先将a的值赋值给b,然后运算数a在进行计算
printf("a=%d,b=%d\n",a,b);// a=2,b=1//++i
int x = 1;
int y = ++x; //运算数在后,先计算运算数x的值,然后将计算后的运算数x的值赋值给y
printf("x=%d,y=%d\n",x,y); //x=2;y=2
赋值运算符
结果:赋值后的变量的值
赋值顺序:由右到左
=、+=、-=、*=、/=、%=
举例:
int i = 0;// 将右侧的常量0赋值给左侧的变量i
int sum = 0;
sum += i;//等价于sum=sum+i
sum *= i;//等级于sum=sum*i
关系运算符
表达式=运算符+运算数
关系表达式=关系运算符+运算数
结果:布尔类型(默认结果:0代表假,非0代表真;引入stdbool.h文件,false代表假,true代表真)
举例:
#include <stdbool.h>bool is_flag = true;//引入stdbool.h的真int is_flag2 = 1;//默认的真
>、<、>=、<=、==、!=
注意:
两个浮点型数据进行比较的时候,不能使用==。因为比较出来的结果是不确定的,解决方案:参与比较的两个操作数相减,跟0比较,举例:
float a = 22.1,b = 22.1;
a - b == 0;// a == b
a - b > 0 ;// a > b
a - b < 0 ;// a < b
逻辑运算符
结果:布尔类型
&&、||、!
&&:运算符左右两侧表达式都成立,则结果为真;有一个不成立,则结果为假。
||:运算符左右两侧表达式都不成立,则结果为假;有一个成立,则结果为真。
! :对原操作数或者表达式结果取反,如果原操作数或者表达式结果为真,则最终结果为假;反之最终结果为真。
偶数:!(a % 2 == 0) 取反之后变奇数
奇数:!(a % 2 != 0) 取反之后变偶数
惰性运算
惰性计算的目的是减少运算的次数。从而提供运算效率。
短路与:如果&&左侧表达式返回假,就不再执行右侧表达式,最终返回的结果就是左侧表达式的结果(假)
短路或:如果||左侧表达式返回真,就不再执行右侧表达式,最终返回的结果就是左侧表达式的结果(真)
逗号运算符
结果:最后一个表达式的结果
语法: 表达式1,表达式2,...表达式n
位运算
所谓的位运算,就是计算机底层直接针对二进制位进行操作
~、&、|、^、<<、>>
~
:按位取反,单目运算符,针对二进制位,每一位进行取反,如果二进制位0变1,1变0。
&
:按位与,双目运算符,两个数相同二进制位,如果都为1,结果为1;否则结果为0;
|
: 按位或,双目运算符,两个数相同二进制位,有一个为1,结果为1;否则结果为0;
^
:按位异或:双目运算符,两个数相同二进制位,如果相同,结果为0;否则为结果1;
<<
:左移:分为无符号左移和有符号左移,所有二进制位从低位到高位依次左移,超出部分舍弃,缺失部分使用0补齐。举例:5 << 6,快捷公式:, 5 ∗ 2 6 5 * 2^6 5∗26,但是有符号数高位都是1的时候,快捷公式就不适用。
>>
:右移:分为无符号右移和有符号右移,所有二进制位从高位到低位依次右移,超出部分舍弃,确实部分分情况:
① 无符号右移:直接补0
② 有符号右移:算术右移(补1,默认),逻辑右移(补0),这个由计算机系统决定
扩展:
char a; // -128~127 占1字节
unsigned char b; // 0~255 占1字节
char 有符号:
1 1111111 ~ 1 0000000 负数+0 -0 -128~0
0 1111111 ~ 0 0000000 正数+0 +0 127~0
char 无符号:
00000000 ~ 11111111 正数+0 0 ~ 255
流程控制
程序 = 算法 + 数据结构
算法:操作的步骤
数据结构:数据的描述
流程控制三大基本结构
① 顺序结构:默认
② 分支结构:(条件结构、选择结构)根据条件选择性执行,又被分为:单分支(单路分支)、双分支(双路分支)、多分支(多路分支)
③ 循环结构:(重复结构)根据条件重复执行,又被分为:当型循环(先判断,后执行)、直到型循环(先执行,后判断)
扩展:进制转换
进制转换
我们目前接触到的进制有 二进制、八进制、十进制、十六进制
-
其他进制 转 十进制:
按权相加
-
(1234)10 = 4 * 10^0 + 3 * 10^1+2 * 10^2 + 1 * 10^3
-
(0x1234)16 = 4 * 16^0 + 3 * 16^1 + 2 * 16^2 +1 * 16^3
-
-
十进制 转 其他进制:
辗转相除法:将需要转换的数据不停的除以转换的进制数,直到商为0
① 十进制转二进制:
② 十进制转八进制:
-
八进制转十六进制:
借助于二进制,将八进制转换为二进制,将二进制转换为十六进制。
-
十六进制转八进制:
借助于二进制,将十六进制转换为二进制,将二进制转换为八进制。
0xA9F = 1010 1001 1111 (二进制) = 101 010 011 111 (二进制) = 0 5 2 3 7
分(二进制) 合(八进制)
0xE139A = 0B1110 0001 0011 1001 1010 = 011 100 001 001 110 011 010 = 03411632