一.算数操作符
+:加
-:减
*:乘
/:除
%:取余
1.注意加减乘除时候的类型匹配,匹配的类型不同,则计算结果是不一样的
2.除法的注意事项:注意除数不能为0
3.取余%:只能用于整数,整数相除,得到余数
二.移位操作符
移位操作符的操作数只能是整数,作用的是整数的二进制位
(一)整数的三种编码方式
整数的原码、反码和补码是计算机中表示整数的三种编码方式
1.原码:32位比特位,第一位表示符号位,其余位表示真值。正数的原码、补码、反码相同。正数的符号位为0,负数的符号位为1.其余各位为该数绝对值的二进制表示
2.反码:正数的反码和原码相同,负数的反码是在原码的基础上,符号位不变,其余各位按位取反(即1变0,0变1)反码其实是原码到补码的一个过渡,主要用于简化原码到补码的计算
3.补码:正数的补码与原码、反码相同。负数的补码是在其反码的基础上加1(注意:符号位不参与运算)补码是计算机内部存储和运算整数的实际编码方式,它使得计算机能够直接进行二进制数的加减运算
4.原码到补码的计算
(1)正数的原码、反码、补码是相同的
(2)负数:符号位不改变,其余位取反加一
(3)负数的原码到补码有种简便计算:
从右向左,遇到的第一个1及其右边不改变,其他位按位取反,符号位不改变。
补码到原码的逆运算也是这样
(二)左移
左移的规则:左边抛弃,右边补0
左移的效果:值扩大两倍
#include<stdio.h>
int main()
{
int a = -10;
//原码:10000000000000000000000000001010
//补码:11111111111111111111111111110110
int b = a << 1;
//补码:11111111111111111111111111101100
//原码:10000000000000000000000000010100
printf("%d\n", a);
printf("%d\n", b);
//计算机当中存储和运算的是补码
//但是printf函数打印出来的是原码
//b是a移位之后的效果,但是a的值未发生改变
return 0;
}
(三)右移
1.逻辑右移
移动规则:右边丢弃,左边补0
2.算数右移
移动规则:右边丢弃,左边补符号位
#include <stdio.h>
int main()
{
int m = -1;
//原码:10000000000000000000000000000001
//补码:11111111111111111111111111111111
int n = m >> 1;
//补码:11111111111111111111111111111111
//原码:10000000000000000000000000000001
printf("%d\n", m);
printf("%d\n", n);
return 0;
}
三.位操作符
位操作符作用于二进制位
1.按位与 &
运算规则:只有两个数对应的二进制位都为1时,结果位才是1,否则为0
//代码举例
#include<stdio.h>
int main()
{
int a = 3;
//补码:00000000000000000000000000000011
int b = -5;
//原码:10000000000000000000000000000101
//补码:11111111111111111111111111111011
int c = a & b;
//00000000000000000000000000000011
//11111111111111111111111111111011
//00000000000000000000000000000011(运算的补码)
//正数的原码、反码、补码是相同的
printf("%d", c);
return 0;
}
2.按位或 |
运算规则:只要其中一个二进制位为1,结果位就为1
#include<stdio.h>
int main()
{
int a = 3;
//补码:00000000000000000000000000000011
int b = -5;
//原码:10000000000000000000000000000101
//补码:11111111111111111111111111111011
int c = a | b;
//00000000000000000000000000000011
//11111111111111111111111111111011
//11111111111111111111111111111011(运算的补码)
//10000000000000000000000000000101 (还原的原码)
//正数的原码、反码、补码是相同的
printf("%d", c);
return 0;
}
3.按位异或 ^
(1)运算规则:参与运算的两个数,如果两个对应的二进制位值不一样,则结果位1,否则为0
#include<stdio.h>
int main()
{
int a = 3;
//补码:00000000000000000000000000000011
int b = -5;
//原码:10000000000000000000000000000101
//补码:11111111111111111111111111111011
int c = a ^ b;
//00000000000000000000000000000011
//11111111111111111111111111111011
//11111111111111111111111111111000(运算的补码)
//10000000000000000000000000001000 (还原的原码)
//正数的原码、反码、补码是相同的
printf("%d", c);
return 0;
}
(2)异或的相关性质
恒等律:任何数和0异或,结果仍然是原来的数
归零律:任何数和自身异或结果都为0
交换律:A^B=B^A
四.赋值操作符
1.赋值操作符的作用:顾名思义,给变量赋上合适的值
2.区别赋值和等于:赋值操作符:“=”;等于“==”
3.复合赋值
具有运算和赋值的双重作用
#include <stdio.h>
int main()
{
int x = 10;
x = x + 10;
x += 10;//复合赋值
//其他复合赋值运算符一样的道理
return 0;
}
五.单目操作符
1.逻辑反操作符:!
2.正值和负值:+ -
3.取地址:&
4.计算操作数的类型长度(以字节为单位):sizeof
(1)sizeof后面的括号的省略
#include<stdio.h>
int main()
{
int a = 10;
printf("%d", sizeof(a));
printf("%d", sizeof a);//sizeof后的括号,如果是用来计算变量的类型长度,可以省略
printf("%d", sizeof(int));//但如果是直接计算类型的话,必须要加上括号
return 0;
}
(2)sizeof后面括号里的运算不会影响最终变量的值
(3)sizeof不是函数,只是一个编译操作符,而不是一个运行时函数
5.对一个数的二进制位按位取反:~
6.前置、后置++: ++
(1)前置++和后置++的区别
(2)前置++和后置++与赋值加一的区别:前置和后置++具有副作用,会改变变量原来的值
7.前置、后置--: --
前置、后置--的用法和前置、后置++的作用一样
8.间接访问操作符(解引用操作符):*
访问指针所指向的内存地址中的值
#include<stdio.h>
int main()
{
int a = 10;
int* p = &a;//p是指向a的地址
int b = *p;//解引用p,获取a的值,并将该值赋给b
return 0;
}
9.强制类型转换:(类型)
六.关系操作符
用来判断大于、小于、等于和不等于的操作符
<
>
<=
>=
!=:用于测试“不相等”
==:用于测试“相等”
七.逻辑操作符
1.逻辑与:&&
(1)运算规则:如果两个操作数都为真,则结果为真,否则,结果为假
(2)短路现象:
#include<stdio.h>
int main()
{
int i = 0;
int a = 0;
int b = 2;
int c = 3;
int d = 4;
i = a++ && ++b && d++;
//逻辑与的短路现象:
//从左往右的操作数,如果其中一个操作数是0,则右边的运算不再进行
printf("a = %d\nb = %d\nc = %d\nd = %d", a, b, c, d);
return 0;
}
2.逻辑或:||
(1)运算规则:如果两个操作数当中至少有一个为真,则结果为真,如果两个都为假,则结果为假
(2)短路现象:
#include<stdio.h>
int main()
{
int i = 0;
int a = 0;
int b = 2;
int c = 3;
int d = 4;
i = ++a || ++b || d++;
//逻辑或的短路现象:
//从左往右的操作数,如果其中一个操作数是1,则右边的运算不再进行
printf("a = %d\nb = %d\nc = %d\nd = %d", a, b, c, d);
return 0;
}
八.条件操作符
1.运算规则:
exp1 ? exp2 : exp3
真 计算 不计算
假 不计算 计算
2.条件操作符又叫做三目操作符,可以简化一般的分支语句
#include<stdio.h>
int main()
{
int a = 1;
int b = 2;
int i = 0;
if (a < b)
i = a;
else
i = b;
//以上的if else语句可以用三目操作符进行简化
i = (a < b ? a : b);
return 0;
}
九.逗号表达式
1.运算规则:逗号表达式,就是用逗号隔开的多个表达式,从左往右依次进行,整个表达式的结果就是最后一个表达式的结果
2.逗号表达式的应用:多个运算,递进运算