c语言操作符总结(一)

算术操作符

         +      -      *     /        %

1.除了 % 操作符,其他操作符都可以作用于整数和浮点数.
2.对于 / 操作符,如果两端都为整数,执行整数除法,只要有一端为浮点数就为小数除法
3.%操作符两端必须都为整数,返回的是整除之后的余数

移位操作符

1.左移操作符

左移操作符移动规则: 左边抛弃,右边补0

左移其实移动的是存储在内存中的二进制的补码。

先看一下正数的情况

#include<stdio.h>
int main()
{
    
    
	int a = 5;
	int b = a<<1;
	printf("%d",b);
} 
// 输出结果为 10


再看一下负数的情况

#include<stdio.h>
int main()
{
    
    
	int a = -1;
	int b = a<<1;
	printf("%d",b);
} 
// 输出结果为 -2

2.右移操作符

右移操作符分为两类:

1.算数右移:

右边丢弃,左边补符号位

2.逻辑右移

右边丢弃,左边补0

具体采用哪种方式,取决于编译器。

#include<stdio.h>
int main()
{
    
    
	int a = -1;
	int b = a >> 1;
	printf("%d",b);
}
// 输出结果为-1


警告: 对于移位运算符,不要移动负数位,这个是标准未定义的。

#include<stdio.h>
int main()
{
    
    
	int num = 10;
	num>> -1;// error
}

位运算符

1.按位与

& : 按二进制(补码)位与 , 都为1才是1,否则为0

#include<stdio.h>
int main()
{
    
    
	int a = 3;
	int b = 5;
	int c = a & b;
	printf("%d\n",c);
}
// 输出结果为1

2.按位或

| : 按二进制(补码)位或 , 有一位是1就是1 , 全为0才为0 .

#include<stdio.h>
int main()
{
    
    
	int a = 3;
	int b = 5;
	int c = a | b;
	printf("%d\n",c);
}
// 输出结果为7

3.按位异或

^ : 按二进制(补码)位异或 , 相同的为0 , 不相同的为1 .

#include<stdio.h>
int main()
{
    
    
	int a = 3;
	int b = 5;
	int c = a ^ b;
	printf("%d\n",c);
}
// 输出结果为6


警告 : & | ^ 只能作用于整形

4.按位与和按位异或的应用

1.按位异或的应用

大家一定都做过交换两个数的值 , 用的最多的方法应该是创建一个临时变量的方

#include<stdio.h>
int main()
{
    
    
	int a = 3;
	int b = 5;
	int tmp = a;
	a = b;
	b = tmp;
	printf("a = %d,b = %d", a, b);
}
// 输出结果 a = 5, b = 3

现在要求不创建临时变量,交换两个整数的值,可能有人会想到下面这种做法

#include<stdio.h>
int main()
{
    
    
	int a = 3;
	int b = 5;
	a = a + b;
	b = a - b;
	a = a - b;
	printf("a = %d,b = %d", a, b);
}
// 输出结果 a = 5, b = 3

但这种做法有缺陷 ,如果我们的a , b比较大,但还没有超出整形的范围,但a + b就会发

生溢出,导致结果错误。

现给出按位异或的做法

#include<stdio.h>
int main()
{
    
    
	int a = 3;
	int b = 5;
	a = a ^ b;
	b = a ^ b;
	a = a ^ b;
	printf("a = %d,b = %d", a, b);
}
// 输出结果 a = 5, b = 3

2.按位与的应用

求一个整数存储在内存中二进制1的个数

#include <stdio.h>
int main()
{
    
    
	 int num = -1;
	 int i = 0;
 	 int count = 0;//计数
	 while(num)
     {
    
    
		 count++;
		 num = num&(num-1);
 	 }
 	printf("二进制中1的个数 = %d\n",count);
    return 0;
}

赋值操作符

赋值操作符是一个很棒的操作符,他可以让你得到一个你之前不满意的值。也就是你可以

给自己重新赋值。

#include<stdio.h>
int main()
{
    
    
	int weight = 120;
	weight = 89;
	double salary = 10000.0;
	salary = 20000.0;
	// 赋值操作符可以连续使用
	int a = 10;
	int x = 0;
	int y = 20;
	a = x = y + 1; // 连续赋值
	// 相当于以下代码
	x = y + 1;
	a = x;
}

复合运算符

+=

-=

*=

/=

%=

》=

《=

&=

|=

^=

int x = 10; 
x = x + 10;
 x += 10;//复合赋值
//其他运算符一样的道理。这样写更加简洁

猜你喜欢

转载自blog.csdn.net/DR5200/article/details/113137367