目录
1.算术操作符
+ - * / %
1. 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。
2. 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。
3. % 操作符的两个操作数必须为整数。返回的是整除之后的余数。
2.移位操作符
这里的移位要注意的是,移动的是二进制位的补码,数据在内存中存储是以补码的形式存放的,以原码的形式展示
原码:直接按照数据写出的二进制
反码:原码的符号位不变,其他位按位取反
补码:反码+1得到补码
注意:正整数的原反补码都是一致的,只有负数需要计算,最高位是符号位,0代表整数,1代表负数
15正整数:
原码:0000000000000000000000001111
反码:0000000000000000000000001111
补码:0000000000000000000000001111
-15负数:
原码:1000000000000000000000001111
反码:1111111111111111111111110000
补码:1111111111111111111111110001
<< 左移操作符 左边丢弃,右边补0
>> 右移操作符 右边丢弃,逻辑移位下:左边补0;算术移位下:左边补原符号位 vs2022下是算术移位
注:移位可以自定义,不限于1
//左移
int main()
{
int a = 10;
//0000000000000000000000001010 正数原反补相同
int b = a << 1;//左边丢弃一位,右边补0
//0000000000000000000000010100
printf("%d %d\n", a, b); //b = 20
int c = -15;
//1000000000000000000000001111 原码
//1111111111111111111111110000 反码
//1111111111111111111111110001 补码
int d = c << 1;//右边补0
//1111111111111111111111100010 移动后的补码
//1111111111111111111111100001 反码
//1000000000000000000000011110 原码
printf("%d %d", c, d);//-30 以原码的值打印,存储用补码
return 0;
}
//右移
int main()
{
int a = 10;
//0000000000000000000000001010 正数原反补相同
int b = a >> 1;//右边丢弃一位,左边补符号位
//0000000000000000000000000101
printf("%d %d\n", a, b); //b = 5
int c = -15;
//1000000000000000000000001111 原码
//1111111111111111111111110000 反码
//1111111111111111111111110001 补码
int d = c >> 1;//右边丢弃,左边补符号位
//1111111111111111111111111000 移动后的补码
//1111111111111111111111110111 反码
//1000000000000000000000001000 原码
printf("%d %d", c, d);//- 8 以原码的值打印,存储用补码
return 0;
}
3.位操作符
位操作符的操作对象是:二进制中的补码
& 按位与,两个数的对应位中一个为0,结果为就是0,两个对应位都是1,结果位才是1
| 按位或,两个数的对应位中一个为1,结果位就是1,两个对应位都是0,结果位才是0
^ 按位异或,,两个数的对应位相同,结果位就是0,不同则为1
int main()
{
//正数原反补相同
int a = 10;
//0000000000000000000000001010
int b = 15;
//0000000000000000000000001111
int num1 = a & b;//有0为0,两个都是1才为1
//0000000000000000000000001010 10
int num2 = a | b;//有1为1,两个都是0才为0
//0000000000000000000000001111 15
int num3 = a ^ b;//相同位0,相异为1
//0000000000000000000000000101 5
printf("%d %d %d\n", num1, num2, num3);//10 15 5
return 0;
}
4.赋值操作符
赋值操作符,将右边的值,赋给左边
=
复合赋值操作符,先进行运算再赋值
+= -= *= /= %= >>= <<= &= |= ^=int a = 10; a = a+10;//复合赋值 a+=10;//这样写更加简便,其他复合赋值同理
5.单目操作符
! 逻辑反操作- 负值+ 正值& 取地址sizeof 操作数的类型长度(以字节为单位)~ 对一个数的二进制按位取反-- 前置、后置 --++ 前置、后置 ++* 间接访问操作符 ( 解引用操作符 )( 类型 ) 强制类型转换
int main()
{
int y= -10;//负数
int* p = NULL;
printf("%d\n", !2);//真改为假 0
printf("%d\n", !0);//假改为真 1
p = &y;//取y的地址赋给p,p指向y的地址
printf("%d\n", *(p));//对p指向的地址解引用,得到指向空间的内容 -10
//sizeof不是函数
printf("%d\n", sizeof(int));//但是如果求的是类型的大小,就一定要带上括号,否则编译器会报错
printf("%d\n", sizeof y);//函数需要带(),这里sizeof不需要
int a = 5;
int b = a++;//先使用再+1,先把a原来的值赋给b,然后a自增
int c = ++a;//先+1,再使用,a的值先自增,然后再赋给c
int q = 15;
int w = q--;//先使用再-1,先把q原来的值赋给w,然后q自减
int e = --q;//先-1,再使用,q的值先自减,然后再赋给c
int n = 5;
n = ~n;//对n的二进制位中的补码按位取反 -6
printf("%d\n", n);
int m = (int)3.1546;//3.15146是一个浮点数,将它类型转化为整型,赋给m
printf("%d\n", m);//3
return 0;
}
6.关系操作符
> 大于>= 大于等于< 小于<= 小于等于!= 用于测试“ 不相等 ”== 用于测试 “ 相等 ”注意:== 和 = 要区分开来
7.逻辑操作符
&& 逻辑与 条件两边必须都为真,才成立|| 逻辑或 条件两边只要有一方为真,就成立
int main()
{
int a = 4;
int b = 5;
if (a > 4 && b > 4)//两边都为真才打印
printf("hello\n");
if (a > 4 || b > 4)//只要有一边为真,就会打印
printf("world\n");
return 0;
}
//扩展
int main()
{
int i = 0,a=0,b=2,c =3,d=4;
i = a++ && ++b && d++; //a先为0,使用后再++,条件左边就为假,只要为假,后面就不再执行
//i = a++||++b||d++;///a先为0,使用后再++,条件左边为假,右边为真,剩下的不再执行
printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
return 0;
}
8.条件操作符
exp1 ? exp2 : exp3exp1为真,表达式的结果为exp2,exp1为假,表达式的结果是exp3
int a = 8;
int b = 10;
int c = a > b ? a : b;//a>b为假,表达式结果是b
printf("%d\n", c);//10
9.逗号操作符
exp1, exp2, exp3, …expN逗号表达式的结果是最后一个表达式的结果
int a = 1;
int b = 2;
int c = (a>b, a=b+10, a, b=a+1);//13
10.下标引用,函数调用,结构成员
[ ] 下标引用操作符( ) 函数调用操作符. -> 访问一个结构的成员 . 结构体.成员名 ->结构体指针->成员名
//下标引用
int arr[10];//创建数组
arr[9] = 10;//实用下标引用操作符。
//[] 的两个操作数是arr和9。
//函数调用
void test1()
{
printf("hello ");
}
void test2(const char* str)
{
printf("%s\n", str);
}
int main()
{
test1();//()函数直接调用
test2("world");//()函数传参调用
return 0;
}
//访问结构体成员
struct Su
{
int a;
char name[20];
};
int main()
{
struct Su s = { 18,"mingwang" };
struct Su* c = &s;//结构体指针
printf("%d %s\n", s.a, s.name);//结构体.访问成员
printf("%d %s\n", c->a, c->name);//结构体指针->访问成员
return 0;
}