c语言操作符详解 1

前言:

在写完三子棋和扫雷后,我们接着开始新的知识,操作符时c语言中必不可少的角色,运用好可以大大简化代码

1. 操作符分类:

算术操作符

移位操作符

位操作符

赋值操作符

单目操作符

关系操作符

逻辑操作符

条件操作符

逗号表达式

下标引用、函数调用和结构成员

2.算术操作符

+    -   *   /   %

1. 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。

2. 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。

3. % 操作符的两个操作数必须为整数。返回的是整除之后的余数。

2.1例

int main()
{
  int a = 5 / 2;
  int b = 5 % 2;//取模
  double c = 5 / 2.0;
  printf("a=%d\n",a);
  printf("b=%d\n", b);
  printf("c=%lf\n",c);
  return 0;
}

3.移位操作符

<< 左移操作符
>> 右移操作符
    
注:移位操作符的操作数只能是整数。

3.1左移操作符

移位规则:

左边抛弃、右边补0

//左移
int main()
{   
  //0000 0000 0000 0000 0000 0000 0000 0101原码   5
  //0000 0000 0000 0000 0000 0000 0000 0101反码
  //0000 0000 0000 0000 0000 0000 0000 0101补码
  //左移后
  //0000 0000 0000 0000 0000 0000 0000 1010补码  10
  int a = 5;
  int b = a << 1;//b=10
  printf("%d\n",b);
  return 0;
}

3.2 右移操作符

移位规则:

首先右移运算分两种:

3.2.1 逻辑移位

左边用0填充,右边丢弃

3.2.2 算术移位

左边用原该值的符号位填充,右边丢弃

//右移操作符
int main()
{
  //int a = -1;//b=-1
  int a = 16;//b=8
  int b = a >> 1;
  printf("%d\n", b);
  return 0;
}
int main()
{
  int a = -1;//b=-1
  //1000 0000 0000 0000 0000 0000 0000 0001原码
  //1111 1111 1111 1111 1111 1111 1111 1110反码
  //1111 1111 1111 1111 1111 1111 1111 1111补码
  int b = a >> 1;
  printf("%d\n", b);
  return 0;
}

3.3 警告⚠ :

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

例如:

int num = 10;
num>>-1;//error

4. 位操作符

位操作符有:

& //按位与
| //按位或
^ //按位异或
注:他们的操作数必须是整数。

4.1 练习1

//按位与,或,异或
int main()
{
  int num1 = 1;//0001
  int num2 = 2;//0010
  int a = num1& num2;//0000
  int b = num1 | num2;//0011
  int c = num1^ num2;//0011
  printf("%d\n",a);//0
  printf("%d\n", b);//3
  printf("%d\n", c);//3
  return 0;
}

4.2 练习2

//按位与,或,异或
int main()
{
  int a = 3;
  int b = 5;
  int c = a & b;
  int d = a | b;
  int e = a ^ b;
  printf("%d\n", c);
  printf("%d\n", d);
  printf("%d\n", e);
  return 0;
}

4.3 一道变态的面试题:

不能创建临时变量(第三个变量),实现两个数的交换

这题非常灵活,结合位操作符

4.3.1普通统统方法

加减法,显然这样还是太low了

//不创建临时变量交换两个数的值
//加减法
int main()
{
  int a = 3;
  int b = 5;
  a = a + b;
  b = a - b;
  a = a - b;
  printf("after:a=%d b=%d", a, b);
  return 0;
}

4.3.2 异或法

两个数异或后的值 在 和任意的一个值异或一定的另一个值

即 a^b=c  c^a=b

//异或法
int main()
{
  int a = 3;//0011    3
  int b = 5;//0101    5
  a = a ^ b;//0110    6  注意此时的a的值为6时计算时产生的中间值
  b = a ^ b;//0011    3  注意此时b的值已经改变
  a = a ^ b;//0101    5  注意此时a的值已经改变
  printf("after:a=%d b=%d", a, b);
  return 0;
}

4.4 练习:

编写代码实现:求一个整数存储在内存中的二进制中1的个数。

4.4.1方法1

解释%2能统计内存中的二进制中1的个数的原因,举例3=011,一般最外面的1就是余数,我们在%2后就得到的 最外面的1 然后在/2取整数就是去掉最外面的1,然后倒数第二个里面的1就变成了最外面的1了周而复始

注意此方法有bug如果num为-1呢

int main()
{
  int num = 10;//1010
  int count = 0;//计数
  
  while (num)
  {
    
    if (num % 2 == 1)
      count++;
    num = num / 2;
  }
  printf("二进制中1的个数 = %d\n", count);
  return 0;
}

4.4.2 方法2

运用右移操作符和&操作符,因为每右移一位,可以和1进行&运算,&运算取1的特点是只有都为1时结果才为1 即1&1=1,这样可以避免掉0的干扰

int main()
{
  int num = 0;
  scanf("%d",&num);
  int i = 0;
  int count = 0;
  for (i = 0; i < 32; i++)
  {
    if ((num >> i & 1) == 1)
    {
      count++;
    }
  }
  printf("%d\n", count);
  return 0;
}

5. 赋值操作符

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

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;
这样的写法是不是更加清晰爽朗而且易于调试。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值