一、操作符分类
算术操作符
移位操作符
位操作符
赋值操作符
关系操作符
逻辑操作符
条件操作符
逗号表达式
下标引用、函数调用和结构成员
二、算术操作符
‘+’ ‘-’ ‘*’ ‘/’ ‘%’
1.除 '%' 操作符外,其余操作符都可以作用于整数和浮点数。
2.对 '/' 操作符如果两个操作数都是整数,执行整数除法,只要有浮点数执行的就是浮点数除法。
3' %' 操作符的两个操作数必须都是整数,返回的是整除之后的余数。
三、移位操作符
>> 右移操作符
<< 左移操作符
注意:移位操作符的操作数只能是整数 移动的是二进制位
整数的二进制的表示形式:
原码 反码 补码
根据正负直接写出的二进制序列就是原码
一个整型是四个字节,也就是32bit 所以在写二进制时要写32位
最高位是符号位:
符号位是1表示负数
符号位是0表示正数
例如:
5
00000000 00000000 00000000 00000101
-15
10000000 00000000 00000000 00001111
原码、反码、补码之间的转换
1.正整数:
正整数的原码、反码、补码是相同的
2.负整数
(1).先根据十进制写出二进制序列 -- 原码
(2).符号位不变,其它位按位取反 -- 反码
(3).反码加一就是补码 -- 补码
整数在内存中存储的是补码,计算的时候也是使用补码计算的
右移 -- >>
1.算术右移:右边丢弃,左边补原来的符号位
2.逻辑右移:右边丢弃,左边直接补0
注意:C语言没有明确规定是算术右移还是逻辑右移,一般编译器采用的是算术右移
1. int main() 2. { 3. int a=0; 4. int b=a>>1; 5. }
左移 -- <<
左边丢弃,右边补0
三、位操作符
& 按位与
| 按位或
^ 按位异或
注:他们的操作数必须是整数
1. & 按位与
例:求一个整数存储在内存中二进制位的个数
1.获得整数32个bit的每一位
2.判断每位是否是1
3.是1计数器+1
整数 & 1 就可以获得整数的最低位
2. | 按位或
3. ^ 按位异或
例:不用临时变量,交换两个整数
a ^ a = 0; //00000000000000000000000000000101 //00000000000000000000000000000101 //00000000000000000000000000000000 a ^ 0 = a; //00000000000000000000000000000101 //00000000000000000000000000000000 //00000000000000000000000000000101
四、赋值操作符
简单赋值符 -- =
==是判断是否相等
赋值操作符可以连续使用,比如:
1. int a = 10; 2. 3. int x = 0; 4. 5. int y = 20; 6. 7. a = x = y+1 ;
注意:我们要尽量少使用连续赋值,这样的代码可读性不高,分开写我们可以一步一步观察细节
符合赋值符 += 、 -= 、 *= 、 %= 、 >>= 、 <<= 、 &= 、 |= 、 ^=
例如:
1. int x = 10; 2. x = x+10; 3. x += 10;//复合赋值 4. //其他运算符一样的道理。这样写更加简洁
五、单目操作符
单目操作符只有一个操作数
! --逻辑反操作
- --负值
+ --正值
& --取地址
sizeof --操作数的类型长度(单位:字节)
~ --对一个数的二进制按位取反
-- --前置、后置--
++ --前置、后置++
* --解引用操作符
(类型) --强制类型转换
1. ! 逻辑反操作符
2. & 取地址操作符 * 解引用操作符
pa中存放的是地址
*pa = 20; //解引用操作符--通过pa中存放的地址,找到指向的空间(内容)
3.sizeof
说明:sizeof -- 不是函数,是操作符
sizeof计算的是类型创建变量的大小,单位是字节
4. ~ 按位取反
int main() { int a=0; //scanf 读取失败返回的EOF -- -1 //-1 按位取反后是 0 while(~scanf("%d",&a)) { printf("%d",a); } return 0; } int main() { int a=0; while(scanf("%d",&a)!=EOF) { printf("%d",a); } return 0; }1. inint main() { int a=0; //scanf 读取失败返回的EOF -- -1 //-1 按位取反后是 0 while(~scanf("%d",&a)) { printf("%d",a); } return 0; } int main() { int a=0; while(scanf("%d",&a)!=EOF) { printf("%d",a); } return 0; }
5.强制类型转换
1. int main() 2. { 3. int a=(int)3.14; 4. }
六、关系操作符
>
>=
<
<=
!= 用于测试不相等
== 用于测试相等
七、逻辑操作符
&&-- 逻辑与 左边为假,后边就不用算了
| |-- 逻辑或 左边为真,后边就不用算了
八、条件操作符
exp1?exp2:exp3
若表达式1为真,则返回表达式2;若为假则返回表达式3
例如:求两个数的最大值
//通常我们会用if语句来判断 #include <stdio.h> int main() { int a = 3; int b = 5; if (a > b) { printf("max=%d\n", a); } else { printf("max=%d\n", b); } return 0; } //使用条件操作符 int main() { int a = 3; int b = 5; int max = (a > b ? a : b); printf("max=%d",max); return 0; }
九、逗号操作符
exp1,exp2,exp3……,expn
逗号表达式,就是用逗号隔开的多个表达式。
从左向右依次执行。整个表达式的结果是最后一个表达式的结果。
十、下标引用、函数调用和结构成员
1. [ ] 下标引用操作符
操作数:一个数组名 + 一个索引值
int arr[10];//创建数组 arr[9] = 10;//实用下标引用操作符。 [ ]的两个操作数是arr和9。
2. ( ) 函数调用操作符
1. int c = Add(3 ,5); 2. ()的操作数是Add 3 5
对于函数操作符,最少有一个操作数
3. 访问一个结构的成员
. 结构体.成员名
-> 结构体指针->成员名