目录
一,算数操作符
+ - * / 加减乘除
除法:整数除法和小数除法(除数不可以为0)
int main()
{
int r = 7 / 2;
printf("%d\n", r);
double d = 7.0/ 2;
printf("%lf\n", d);
return 0;
}
取模%操作符 (两个操作数必须都是整数)
int main()
{
int r = 17 % 8;
printf("%d", r);
return 0;
}
二,原码反码补码
1. 正整数的三码相同;负整数的要计算
2. 正数:
根据正负直接写出二进制序列就是原码;一个整形是4个字节,32个比特位。例如:
15=00000000000000000000000000001111
-15=10000000000000000000000000001111
(最高位是符号位,是1表示负数,是0表示正数)
3.负数
原码的符号位不变,其他位按位取反得到反码: 11111111111111111111111111110000
反码加1得到补码 : 11111111111111111111111111110001
整数在内存中存储的是补码; 计算的时候也是使用补码计算.
三,移位操作符
1. <<左移操作符 ; >>右移操作符 (操作数是整数)
移位操作符,移位移动的是补码的二进制序列。
2. 右移:算数右移:右边丢弃,左边补符号位。
逻辑右移:右边丢弃,左边补0(一般编译器用算数右移)
00000000000000000000000000000111
15右移得到7。(正数右移有除2的作用)
int main()
{
int a = 15;
int b = a >> 1;
printf("%d\n", b);
printf("%d\n", a);
}
//结果为7 ,15
3. 左移:左边丢弃,右边补0
int main()
{
int a = 15;
int b = a << 1;
printf("%d\n", b);
printf("%d\n", a);
}
//结果是30 ,15
> 要想改变a的值,a<<=a a>>=a。
> 对于移位运算符,不要移动负数位,这个是标准未定义的。
四,位操作符
& 按位与 | 按位或 ^按位异或 (操作的是二进制位)
1. &:对应二进制位都为1才是1
int main()
{
int a = 3;
//0000000000000000000000000000011
int b = -5;
//1000000000000000000000000000101;
//1111111111111111111111111111010;
//1111111111111111111111111111011;
int c = a & b;
//0000000000000000000000000000011;
printf("%d\n", c);
return 0;
}
//结果是3
2. | :对应二进制位都为0才为0
int main()
{
int a = 3;
//0000000000000000000000000000011
int b = -5;
//1000000000000000000000000000101;
//1111111111111111111111111111010;
//1111111111111111111111111111011;
int c = a | b;
//1111111111111111111111111111011;
printf("%d\n", c);
return 0;
}
//结果是-5
3. ^ :对应二进制位相同为0,相异为1。
int main()
{
int a = 3;
int b = -5;
int c = a ^ b;
printf("%d\n", c);
return 0;
}//结果是-8
4.不创建临时变量,交换两个变量的值
int main()
{
int a = 3;
int b = 5;
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("%d %d", a, b);
return 0;
}
五, 赋值操作符
1. 复合赋值符
2.单目操作符
int main()
{
int flag = 0;
if (flag == 0)
{
printf("hello\n");
}
if (!flag)
{
printf("hello\n");
}
return 0;
}
(2)&和*用于指针,&取地址;*是解引用操作符 (j间接访问),通过pa中存放的地址,找到指向的空间(内容)。
int main()
{
int a = 0;
int* pa = &a;
*pa = 20;
return 0;
}
(3)sizeof 不是函数,是操作符
int main()
{
int arr[10] = { 0 };
printf("%d\n", sizeof(arr));
printf("%d\n", sizeof(arr[0]));
return 0;
}//J结果为40和4
(4)~ 按位取反
int main()
{
int a = 0;
printf("%d\n", ~a);
//0000000000000000000000000000000补码
//1111111111111111111111111111111补码
//1111111111111111111111111111110反码
//1000000000000000000000000000001原码
return 0;
//结果是-1
}
int main()
{
int a = 13;
//0000000000000000000000000001101
// 想得到:
//0000000000000000000000000011101
a = a | (1 << 4);
printf("%d\n", a);
//要想复原
//1111111111111111111111111101101
a = a & ~(1 << 4);
printf("%d\n", a);
return 0;
}
(5)前置++和后置++
int main()
{
int a = 1;
int b = a++;//后置++,先使用再++
printf("%d %d", a, b);
return 0;
}// 2 1
int main()
{
int a = 1;
int b = ++a;//前置++,先++再使用
printf("%d %d", a, b);
return 0;
}// 2 2
(6)强制类型转换(少用)
int main()
{
int a = (int)3.14;
printf("%d", a);
return 0;
}
//结果是3
六,逻辑操作符
&&逻辑与 ||逻辑或
&&操作符,左边为假就不用再算了
||操作符,左边为真就不用再算了
int main()
{
int a = 5;
int b = 0;
if (a == 5 && b == 5)
{
printf("hello\n");
}
if (a == 5 || b == 5)
{
printf("hi\n");
}
return 0;
}
int main()
{
int i = 0, a = 0, b = 2, c = 3, d = 4;
i = a++ && ++b && d++;
printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
return 0;
}
//结果是1 2 3 4
int main()
{
int i = 0, a = 1, b = 2, c = 3, d = 4;
i = a++||++b||d++;
printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
return 0;
}
//结果是2 2 3 4