3

c语言操作符总结(一)

 4 years ago
source link: https://blog.csdn.net/DR5200/article/details/113137367
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

算术操作符

         +      -      *     /        %

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;//复合赋值
//其他运算符一样的道理。这样写更加简洁

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK