易错点
1)对于取模%操作符来说,两边必须是整型。
2)对于 / 操作符如果两个操作数都为整数,执行整数除法;而只要有一个浮点数,执行的就是浮点数除法。
一、移位操作符
<< 箭头指向左手:左移操作符
>>箭头指向右手:右移操作符
注:移动的是二进制位,位数看数据类型。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = -1;
int b = a >> 1;
printf("b = %d\n", b);
return 0;
}
在计算机中数字都是用补码存放,原因很简单,因为补码与数字是一 一对应的,
比如用原码时,正0、0、负0都表示0。
原码不是一 一对应。
所以a的二进制原码为:1001(这里就不补全为32位了)
在移位运算时是用补码的,即1111,
算术右移一位为:1111,
再变为原码1001即-1传给b。
所以b还是-1。
注:左移操作符,左边丢弃,右边补0.
只能作用于整数。
例:不用临时变量交换两级数
1.2.正常写法:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 10;
int b = 20;
int tmp = 0;
printf("before:a = %d, b = %d\n", a, b);
tmp = a;
a = b;
b = tmp;
printf("after:a = %d, b = %d\n", a, b);
return 0;
}
加减法:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 10;
int b = 20;
printf("before:a = %d, b = %d\n", a, b);
a = a + b;
b = a - b;
a = a - b;
printf("after:a = %d, b = %d\n", a, b);
return 0;
}
缺陷:a和b都为较大的值时,相加可能溢出,总和不准。
2.
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 10;
int b = 20;
printf("before:a = %d, b = %d\n", a, b);
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("after:a = %d, b = %d\n", a, b);
return 0;
}
原理参考:https://blog.csdn.net/borefo/article/details/4622288
任何一位二进制数同 1 异或相反(0 同 1 异或的结果是 1,1 同 1 异或的结果是 0)
任何一位二进制数同 0 异或不变(0 同 0 异或的结果是 0,1 同 0 异或的结果是 1)
a = 3, b = 4
a = 011
b = 100
a ^ b = 111,和a按位比是:相反,不变,不变
b = 100
a^b^b= 011,和a^b按位比是:相反,不变,不变
即a与a^b:相反,不变,不变,
a^b与a^b^b:相反,不变,不变,
a与a^b是相反的,a^b又与a^b^b相反,那么a^b = a相反,推出a^b^b = a相反的相反,那么就是a 与 a^b^b是相同的。
所以有两个异或直接抵销。
疑点1.正数为什么原、反、补相同?
2.十进制转二进制原理是什么?
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int num = 0;
int count = 0;
int i = 0;
scanf("%d", &num);
//统计num的二进制补码中1的个数
for(i=0; i<32; i++)
{
if(1 == ((num>>i)&1))
count++;
}
printf("%d\n", count);
return 0;
}
注:()的优先级问题。
与的位操作符为 &
二、赋值操作符:重新赋值
三、
四、
注:a + b 有两个操作数,所以“+”是双目操作符。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 0;
if(a)
{
printf("666\n");
}
if(!a)
{
printf("666\n");
}
return 0;
}
!a:a为假时。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 10;
int* p = &a;//取地址操作符
*p = 20;//解引用操作符
printf("a = %d\n", a);
return 0;
}
sizeof后面是数据类型不能省略括号,后面是变量名时可以省略。