【C语言】操作符详解(一)

简介: 【C语言】操作符详解(一)

操作符的分类

算数操作符

位移操作符

位操作符

赋值操作符

单目操作符

关系操作符

逻辑操作符

条件操作符

逗号表达式

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

算数操作符

+ - * / %

  1. 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。
  2. 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。
  3. % 操作符的两个操作数必须为整数。返回的是整除之后的余数。
  4. 代码如下:

%操作符得使用:左右两边必须是两个整数,不然程序会报错无法运行。

#include<stdio.h>
int main()
{
  double a = 3.5;
  double b = 1.1;
  double c = a % b;
  printf("%lf",c );
  return 0;
}

对于/操作符的理解:

  • 整数除法
  • 小数除法

整数除法代码:

#include<stdio.h>
int main()
{
  int a = 5;
  int b = 7;
  int c = b / a;
  printf("%d", c);
  return 0;
}

得到的结果为什么是1呢?因为/操作符两边是整数,只保留小数点前面的数,这就是整数除法。怎么得到小数点后面的数呢?那就需要用到小数除法,以下就是小数除法的代码:

#include <stdio.h>
int main()
{
  int a = 2;
  double b = 5.0;
  double c = b / a;
  printf("%lf", c);
  return 0;
}

只要/操作符两边任意一个数为小数类型就执行了小数除法。

位移操作符

<< 左移操作符 >> 右移操作符

位移操作符只能操作整数。

左移操作符

左边抛弃,右边补0

代码展示:

#include<stdio.h>
int main()
{
  int a = 10;
  a = a << 1;
  printf("%d", a);
  return 0;
}

右移操作符

  1. 逻辑移位 左边用0填充,右边丢弃
  2. 算术移位 左边用原该值的符号位填充,右边丢弃

代码展示:

#include<stdio.h>
int main()
{
  int a = 10;
  a = a >> 1;
  printf("%d", a);
  return 0;
}

由此我们可以得出结论:

正整数右移一位相单与除2,左移一位相当与乘2。

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

位操作符

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

例题:

交换两个整数

#include<stdio.h>
int main()
{
  int a = 3;
  int b = 5;
  int temp = 0;
  temp = a;
  a = b;
  b = temp;
  printf("%d %d", a, b);
  return 0;
}

这是创建了临时变量来交换两个整数。

当题目变成不能创建临时变量来交换两个整数代码如下:

#include<stdio.h>
int main()
{
  int a = 3;
  int b = 5;
  a = a + b;
  b = a - b;
  a = a - b;
  printf("%d %d", a, b);
  return 0;
}

这个代码也有一个缺陷,当我们需要交换的数太大的时候两个数相加就会超过int类型的范围,所以我们就可以使用位操作符来解决。

代码如下:

#include<stdio.h>
int main()
{
  int a = 3;
  int b = 5;
  a = a ^ b;
  b = a ^ b;
  a = a ^ b;
  printf("%d %d", a, b);
  return 0;
}

例题2:

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

#include <stdio.h>
int main()
{
  int a = 15;
  int count = 0;
  while (a)
  {
    if (a%2==1)
    {
      count++;
      a = a / 2;
    }
  }
  printf("%d", count);
  return 0;
}

这代码有一个局限性就是当要算的数是负数的时候程序就无法运行。下面我使用位操作符写的代码就可以解决这个问题

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

但是这个代码也是有一点瑕疵的,就是要循环32次,下面是我改进的代码:

#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;
}

也是可以解决问题的。

这样的代码不需要循环32次,减少了程序的工作量。

赋值操作符

=

代码如下:

#include<stdio.h>
int main()
{
  int a = 0;
  int b = 3;
  //给a和b重新赋值
  a = 34;
  b = 5;
  //打印a和b的值
  printf("%d %d", a, b);
  return 0;
}

赋值操作符也可以连续赋值代码如下:

#include<stdio.h>
int main()
{
  int a = 0;
  int b = 3;
  //连粗赋值
  a = b = b + b;
  printf("%d %d", a, b);
  return 0;
}

复合赋值操作符

+= -= *= /= %= >>= <<= &= |= ^=

这些运算符都可以写成复合的效果

代码如下:

#include<stdio.h>
int main()
{
  int a = 4;
  int b = 5;
  //相当于 a=a+b
  a += b;
  printf("%d", a);
  return 0;
}

相关文章
|
23天前
|
存储 C语言 索引
【C语言篇】操作符详解(下篇)
如果某个操作数的类型在上⾯这个列表中排名靠后,那么⾸先要转换为另外⼀个操作数的类型后执⾏运算。
|
23天前
|
程序员 编译器 C语言
【C语言篇】操作符详解(上篇)
这是合法表达式,不会报错,但是通常达不到想要的结果, 即不是保证变量 j 的值在 i 和 k 之间。因为关系运算符是从左到右计算,所以实际执⾏的是下⾯的表达式。
|
1月前
|
C语言
C语言操作符(补充+面试)
C语言操作符(补充+面试)
30 6
|
30天前
|
存储 编译器 C语言
十一:《初学C语言》— 操作符详解(上)
【8月更文挑战第12天】本篇文章讲解了二进制与非二进制的转换;原码反码和补码;移位操作符及位操作符,并附上多个教学代码及代码练习示例
42 0
十一:《初学C语言》—  操作符详解(上)
|
2月前
|
C语言
五:《初学C语言》— 操作符
本篇文章主要讲解了关系操作符和逻辑操作符并附上了多个代码示例
32 1
五:《初学C语言》—  操作符
|
3月前
|
C语言
C语言逻辑操作符的短路问题
C语言逻辑操作符的短路问题
|
3月前
|
编译器 C语言
【C语言】:中移位操作符,位操作符详运算规则详解
【C语言】:中移位操作符,位操作符详运算规则详解
27 1
|
3月前
|
存储 编译器 C语言
|
3月前
|
存储 C语言 索引
【C语言基础】:操作符详解(二)
【C语言基础】:操作符详解(二)
|
3月前
|
编译器 C语言
C语言学习记录——操作符详解知识点选记(算术操作符、单目操作符、移位操作符、关系操作符、逻辑操作符、条件操作符......)二
C语言学习记录——操作符详解知识点选记(算术操作符、单目操作符、移位操作符、关系操作符、逻辑操作符、条件操作符......)二
38 3