1 算术运算符
c语言中可以使用加减乘除(+,-,*,/)以及取余(%)这些操作符
注意点:
a、0不能做除数,不能对0进行取余,0.0可以做除数,结果是无穷大。
b、取余操作的两边必须是整数;
c、两个整数相除,结果取整数部分;
d、浮点数不能取余;
2 赋值操作符
赋值操作符(=)用于对变量赋值,左边必须是变量,右边是可以当成数字使用的内容,赋值操作符的优先级很低,但是比,优先级高。
多个赋值操作符从右向左计算。
复合赋值操作符(+=,-=,*=,/=),其优先级和赋值操作符的优先级一样。
swap.c
#include <stdio.h>
int main() {
int num = 3, num1 = 7;
/*int num2 = 0;
num2 = num;
num = num1;
num1 = num2;*/
/*num = num + num1;
num1 = num - num1;
num = num - num1;*/
num = num - num1;
num1 = num + num1;
num = num1 - num;
printf("num是%d,num1是%d\n", num, num1);
return 0;
}
3 自增自减运算符
自增,自减运算符(++,–),只能对变量进行操作,两种操作(前操作、后操作)的区别在于操作的时机,前操作的优先级非常高,后操作的优先级非常低
不要在一条语句中对同一个变量进行多次自增或自减运算
4 逻辑运算符
逻辑表达式的计算结果或者是真或者是假,c语言中用数字1表示真,数字0表示假 。
布尔类型用来表示真和假这两个内容,布尔类型的名称是bool。为了使用布尔类型,需要包含头文件stdbool.h,布尔类型只包含两个数字,true(代表真)和false(代表假)
逻辑操作符用来拼写逻辑表达式
所有整数都可以当逻辑表达式使用,0代表假,其他所有整数都代表真
求反(!)也是一个逻辑操作符
逻辑操作符的优先级低于算术操作符
两个逻辑操作符可以用来把两个简单的逻辑表达式合并成一个复杂的逻辑表达式,他们分别是&&(与)和||(或)
&&和||都具有短路特性(当前一个逻辑表达式可以决定整个表达式的计算结果时,后一个逻辑表达式根本就不会计算)
一般不要在逻辑表达式中对变量内容作修改
5 关系运算符
等于(==),不等于(!=),大于(>),小于(<),大于等于(>=)和小于等于(<=)
注意点:
在c语言中,如果进行大小判断i < j < k,这样写不是取j大于i小于k之间的数据,编译器认为,从左向右进行判断i < j,(1,0)用这个结果与k进行判断
i < j && j < k ———-正确的逻辑
不可将浮点变量用“==”或“!=”与任何数字比较。
浮点数不能直接比相等,计算机对浮点数进行计算的原理是只保证必要精度内正确即可,所以小数点最后有些位是不准确的。
要比较相等,不能直接用“==”来判断,只看两数差值在一定精度范围内,就可以认为相等。用fabs函数即可。
#include <math.h>
double fabs(double x);
Link -with -lm.
6 位运算符(针对二进制进行计算)
1 按位与(&)
0 & 0 0
1 & 1 1
0 & 1 0
3 & 5=0000 0011 & 0000 0101=0000 0001
按位与可以把某些二进制位清零
2 按位或(|)
0 | 0 0
1 | 1 1
1 | 0 1
3 | 5 = 0000 0011 | 0000 0101=0000 0111
按位或可以把一个数字的某些数位设置成1
3 按位异或(^)
按位异或:对应的二进制位相同为0,不同为1
0 ^ 0 0
1 ^ 1 0
1 ^ 0 1
3 ^ 5 = 0000 0011 ^ 0000 0101 =0000 0110
按位异或可以把某些数位求反(与1按位异或)
a、两个相同的数按位异或,结果为0
b、任何数与0取异或,结果都是其本身
int a = 10;b = 20;
a = a^b;
b = a^b;
a = a^b;
上面代码实现的是交换a,b两个变量中的数据
a = 10 ^ 2o
b = a ^ b = 10 ^20 ^20 = 10
a = a ^ b =10 ^20 ^ 10 =20
还可以通过加减运算,不引入第三个变量,交换两个数的值,但任何类型的变量,都有一个取值范围
int类型的取值范围(-2^31~2^31-1,负21亿到正21亿),a+b超过范围,则只会截取四个字节的数据,造成数据丢失
4 按位求反(~)
把一个数字中的所有二进制数位求反
~3 = 1111 1100=0xfffffffc
7 三目运算符(条件运算符) ? :
三目运算符可以根据一个逻辑表达式从两个数值中选择一个作为结果
8 移位操作符:左移(<<)和右移(>>)
左移固定在右边补0,如果一个数字向左移动n位,且有效数位没有损失,那么数字增大2的n次方
3 << 2 = 0000 0011 << 2 =0000 1100 = 12
12 >> 2 =0000 1100 >> 2 =0000 0011 = 3
一个数字右移,在左边的所有移后的空位上,补符号位,无符号数字右移左边补0
int num=0x8000000c >> 2 =0xe0000003
9 取地址操作符(&)
*操作符(指针运算符)可以根据变量的地址表示变量
10 逗号运算符
用于连接多个表达式:
表达式1,表达式2,…表达式n
a、顺序求值,会从左边第一个表达式开始,顺序向右计算各个表达式的值
b、逗号表达式的结果,是取其中最后一个表达式的值,即取表达式n的值
11 类型转换
隐式类型转换会把一个表达式中所有数字都转换成同一个类型,然后再进行计算。把占地小的数据转换成占地大的类型后再计算,占地同样大小的数据则把有符号数据转换成无符号数据。整数转换成浮点数。
隐式类型转换只是把原数据转换成某种新的同一形式用于计算,但并不会改变原来的数据。
强制类型转换可以把一个数字转换成另外一种类型使用,使用方法如下:
(char)100 表示把数字100当成char类型使用
强制类型转换过程中有可能造成数据的丢失 printf(“%d,%d”,300,(char)300);