C语言基础之——操作符(上)

本篇文章,我们将展开讲解C语言中的各种常用操作符,帮助大家更容易的解决一些运算类问题。

这里提醒一下小伙伴们,本章知识会大量涉及到二进制序列,不清楚二进制序列的小伙伴,可以去阅读我的另一篇文章《数据在内存中的存储》学习了解。


目录

一.操作符分类

二.操作符讲解

1.算数操作符

2.移位操作符

(1)左移操作符 

(2)右移操作符

3.位操作符

(1)& 按位与

 (2)| 按位或

 (3)^ 按位异或

4.赋值操作符

5.单目操作符

总结


一.操作符分类

  • 算术操作符
  • 移位操作符
  • 位操作符
  • 赋值操作符
  • 单目操作符
  • 关系操作符
  • 逻辑操作符
  • 条件操作符
  • 逗号表达式
  • 下标引用,函数调用和结构成员

二.操作符讲解

由于操作符数量过多,所以本期文章我们将仅仅讲解前五种。

1.算数操作符

算数操作符包括 “+,-,*,/,%” 五个。较为简单,小伙伴们只需要注意以下几点:

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

2.移位操作符

<<        左移操作符

>>        右移操作符

移位操作符的左边是要操作的数右边则是要移动的位数

要注意的是,移位操作符的操作数只能是整数,移动的对象则是整数的二进制序列

一个整型占四个字节,也就是32个bit位,要记住,整型在数据中存储的是二进制序列的补码,所以我们对整型的操作都是对其补码进行操作的。

(1)左移操作符 

左移操作符,顾名思义就是将整数的二进制序列向左边移动呗,那么它的规则是什么呢???

移位规则:

左边丢弃,右边补0

#include<stdio.h>
int main()
{int n = 6;//00000000 00000000 00000000 00000110-移动前//00000000 00000000 00000000 00001100-移动后int m = n << 1;printf("%d\n", n);printf("%d\n", m);return 0;
}

如上代码,将“6”的二进制序列向左移动一位,便得到了一个新的二进制序列。结果如下:

 由结果可以看出,移位操作符并不会改变操作数本身,而且细心的小伙伴们可以看出,向左移动一位不就相当于每一位的数字都“乘2”嘛,也就是将数字翻倍,移动n位,便翻2的n次方倍

负数的操作与之一样,就是小伙伴们千万不要忘记原码和补码之间的转换

(2)右移操作符

移位规则:

右移运算分为两种:

1.逻辑移位

左边用0填充,右边丢弃

2.算术移位

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

不同的编译器会有不同的右移运算,但是我们平时所使用的绝大多数编译器都是算数右移

#include<stdio.h>
int main()
{int n = -15;//10000000 00000000 00000000 00001111-原码//11111111 11111111 11111111 11110000-反码//11111111 11111111 11111111 11110001-补码//11111111 11111111 11111111 11111000-移动后补码//11111111 11111111 11111111 11110111-移动后反码//10000000 00000000 00000000 00001000-移动后原码int m = n >> 1;printf("%d\n", n);printf("%d\n", m);return 0;
}

结果如下: 

 同左移类似,右移则是将数字折半,但是如果是奇数的话,结果则会是比小数小的最临近于小数的负数。比如-15的右移结果就是-8。

3.位操作符

&       按位与

|         按位或

^        按位异或

位操作符的操作数也必须是整数,也是对其二进制序列动手。

(1)& 按位与

假如我是一个企业高管,我现在需要程序员A程序员B一起来完成某个项目,这说明,A和B是必不可少的,他们两个少了谁这个项目都完不成。这便是按位与

口诀:同真则真,有假则假

#include<stdio.h>
int main()
{int a = 6;//00000000 00000000 00000000 00000110-补码int n = -15;//11111111 11111111 11111111 11110001-补码int m = a & n;//00000000 00000000 00000000 00000110-补码//11111111 11111111 11111111 11110001-补码//00000000 00000000 00000000 00000000-m的补码(重点)printf("%d\n", m);return 0;
}

我们习惯上将二进制序列的“1”视为真“0”视为假,a&n,便是两个二进制序列对应的每一位相与,从而得到一个新的二进制序列。

由上可知,m的二进制序列全为0,也就代表m的值为0,结果如下:

 (2)| 按位或

假如我又是一个企业高管,我现在需要程序员A程序员B来完成某个项目,这说明,A和B他们两个只要有一个能来做这个项目,就能成,如果一个都没有,就做不了。这便是按位或

口诀:同假则假,有真则真

#include<stdio.h>
int main()
{int a = 6;//00000000 00000000 00000000 00000110-补码int n = -15;//11111111 11111111 11111111 11110001-补码int m = a | n;//00000000 00000000 00000000 00000110-补码//11111111 11111111 11111111 11110001-补码//11111111 11111111 11111111 11110111-m的补码(要点)//11111111 11111111 11111111 11110110-m的反码//10000000 00000000 00000000 00001001-m的原码printf("%d\n", m);return 0;
}

对两个二进制序列的每一位相或,便得到m的补码,但是m的符号位为1,是负数,所以要转化为原码来读。

结果如下:

 (3)^ 按位异或

假如我还是一个企业高管……这个不好举例子了哈哈哈直接来看口诀:

相同为0,不同为1

#include<stdio.h>
int main()
{int a = 6;//00000000 00000000 00000000 00000110-补码int n = -15;//11111111 11111111 11111111 11110001-补码int m = a ^ n;//00000000 00000000 00000000 00000110-补码//11111111 11111111 11111111 11110001-补码//11111111 11111111 11111111 11110111-m的补码(重点)//11111111 11111111 11111111 11110110-m的反码//10000000 00000000 00000000 00001001-m的原码printf("%d\n", m);return 0;
}

将两个二进制序列的每一位相异或,结果如下:

4.赋值操作符

所谓赋值操作符,也就是我们经常使用的“ = ”将一个常量或者常量表达式赋给一个变量

int a = 1;//不是赋值,是创建之后的初始化

a = 5;//是赋值

int b = 2;

int c = 0;

c = a + b;//也是赋值

除了等号以外,还有一些常用的复合赋值操作符:

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

这些符合赋值其实是两个运算式的合并,例如:

int a = 2;

a = a + 5 和 a += 5 是一样的效果,后者看起来会更加的简洁

5.单目操作符

所谓单目,也就是这种操作符的操作数只有一个

  • !                逻辑反操作
  • -                   负值
  • +                  正值
  • &                  取地址
  • sizeof           操作数的类型长度(以字节为单位)
  • ~                  对一个数的二进制按位取反
  • --                  前置后置--
  • ++                前置后置++
  • *                   间接访问操作符(解引用操作符)
  • (类型)           强制类型转换

 这些操作符我们大多数都知道,下面我们仅仅讲解一下不是那么熟悉的:

sizeof        操作数的类型长度

sizeof 计算的结果是 size_t 类型

size_t 是无符号整型

对 size_t 类型的数据进行打印,可以使用%zd或%u

int a = 10;

printf("%zd",sizeof(a));

结果为4。 

~                  对一个数的二进制按位取反

int a = 0;

printf("%d",~a);

0的补码二进制序列为:

00000000 00000000 00000000 00000000

111111111 111111111 111111111 111111111//为负数,取原码

111111111 111111111 111111111 111111110//反码

10000000 00000000 00000000 00000001//原码

结果为-1。

*        间接访问操作符

int a = 10;

int* p = &a;

*p;//这时候我们的*就是对p进行解引用操作,*p是通过p中存放的地址,找到p指向的对象。

*p 其实就是a。

(类型)           强制类型转换

int a = (int )3.14;

3.14在编译器中会被默认为是double类型,如果直接将其初始化给int型的a,则会在后续操作中出现误差甚至错误,所以要将其强制类型转化为int型。

总结

本期关于操作符的知识讲解到这里就要结束啦,稍后博主将更新C语言基础之——操作符(下)来讲解剩余的操作符。

喜欢博主文章的小伙伴们不要忘记一键三连哦,我们下期再见!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/102803.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

行业追踪,2023-08-23

自动复盘 2023-08-23 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…

养号自动化,指纹浏览器和RPA机器人解除烦恼

在这个充满科技魔力的时代&#xff0c;社交媒体已经成为人们生活的一部分&#xff0c;而Facebook更是我们分享欢乐、联络亲友的重要平台。然而&#xff0c;随之而来的是一个棘手的问题&#xff1a;如何保持账号的活跃度&#xff0c;而又不被沉重的养号工作压垮&#xff1f;别担…

江西抚州新能源汽车3d扫描零部件逆向抄数测量改装-CASAIM中科广电

汽车改装除了在外观方面越来越受到消费者的青睐&#xff0c;在性能和实用性提升上面的需求也是日趋增多&#xff0c;能快速有效地对客户指定汽车零部件进行一个改装&#xff0c;是每一个汽车改装企业和工程师的追求&#xff0c;也是未来消费者个性化差异化的要求。下面CASAIM中…

【Modbus通信实验三】数据切片问题

在做两个串口相互通信的实验中&#xff0c;当发送频率快一点时偶尔会遇到以下情景&#xff0c;即一次send中把原数据拆成两份发送&#xff0c;就会导致CRC校验错误。下图中6字节数据拆成42是把SetRThreshold()阈值设为2&#xff0c;当设为1的情况下则会拆成51。 一开始以为是缓…

有趣的数学 数学建模入门二 一些理论基础

一、什么是数学建模? 现实世界中混乱的问题可以用数学来解决&#xff0c;从而产生一系列可能的解决方案来帮助指导决策。大多数人对数学建模的概念感到不舒服&#xff0c;因为它是如此开放。如此多的未知信息似乎令人望而却步。哪些因素最相关&#xff1f;但正是现实世界问题的…

【网络】DNS | ICMP | NAT | 代理服务器

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《网络》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 前面几篇文章虽然讲介绍了整个网络通信的协议栈&#xff0c;我们也知道了完整的网络通信过程&#xff…

【Java 高阶】一文精通 Spring MVC - 数据验证(七)

&#x1f449;博主介绍&#xff1a; 博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家&#xff0c;WEB架构师&#xff0c;阿里云专家博主&#xff0c;华为云云享专家&#xff0c;51CTO 专家博主 ⛪️ 个人社区&#x…

数字化技术无限延伸,VR全景点亮智慧生活

随着互联网的发展&#xff0c;我们无时无刻不再享受着互联网给我们带来的便利&#xff0c;数字化生活正在无限延伸&#xff0c;各行各业也开始积极布局智能生活。要说智慧生活哪个方面应用的比较多&#xff0c;那应该就是VR全景了&#xff0c;目前VR全景已经被各个行业广泛应用…

android studio安装教程

1、android studio 下载 下载网址&#xff1a;Download Android Studio & App Tools - Android Developers 2、开始安装 因为不需要每次连接手机进行调试&#xff0c;android studio给我们提供了模拟器调试环境。 一般选择自定义安装&#xff0c;这样可选sdk以及下载路径…

Idea Maven 构建,运行Java程序,二次开发Jmeter

Idea Maven 构建 1. maven下载2. Idea 配置3. 配置Maven镜像4. 在Maven项目pom.xml中添加依赖5. 创建jar包&#xff0c;更新pom&#xff0c;执行代码 1. maven下载 【官网】https://maven.apache.org/download.cgi 【其他版本】https://dlcdn.apache.org/maven/maven-3/ 2. …

【案例】登录注册

<template><div class"loginhome"><Header :butShow"butShow"></Header><div class"formdiv"><div style"text-align:center;padding:10px;"><h3>你好登录账号{{ stauts 3? 注册:登录 }}…

servlet介绍,tomcat容器下载启动

1.1servlet是什么&#xff1f; servlet是一种java程序类&#xff0c;这些类继承了httpservlet类。这些类没有main方法&#xff0c;有两大对象request请求&#xff0c; response响应对象。这些类需要servlet容器才可以运行。 servlet 2.5 servlet 3.0 WEB-INF/web.xml <…

UE4与pycharm联合仿真的调试问题及一些仿真经验

文章目录 ue4与pycharm联合仿真的调试问题前言ue4端的debug过程pycharm端 一些仿真经验小结 ue4与pycharm联合仿真的调试问题 前言 因为在实验中我需要用到py代码输出控制信息给到ue4中&#xff0c;并且希望看到py端和ue端分别在运行过程中的输出以及debug调试。所以&#xf…

IntelliJ IDEA maven配置,设置pom.xml的配置文件

IntelliJ IDEA项目&#xff0c;选择 文件 设置&#xff0c;弹窗 构建、执行、部署 构建工具 Maven就可以 maven配置好以后&#xff0c;在pom.xml的配置文件中就可以设置对应的jar包了&#xff0c;这样构建的时候自动需要的jar&#xff0c;在项目中导入即 需要的jar包设置在po…

AVL——平衡搜索树

✅<1>主页&#xff1a;我的代码爱吃辣&#x1f4c3;<2>知识讲解&#xff1a;数据结构——AVL树☂️<3>开发环境&#xff1a;Visual Studio 2022&#x1f4ac;<4>前言&#xff1a;AVL树是对二叉搜索树的严格高度控制&#xff0c;所以AVL树的搜索效率很高…

图床项目进度(一)——UI首页

1. 前言 前面我不是说了要做一个图床吗&#xff0c;现在在做ui。 我vue水平不够高&#xff0c;大部分参考b站项目照猫画虎。 vue实战后台 我使用ts&#xff0c;vite&#xff0c;vue3进行了重构。 当然&#xff0c;我对这些理解并不深刻&#xff0c;许多代码都是游离于表面&am…

小白到运维工程师自学之路 第七十九集 (基于Jenkins自动打包并部署Tomcat环境)2

紧接上文 4、新建Maven项目 clean package -Dmaven.test.skiptrue 用于构建项目并跳过执行测试 拉到最后选择构建后操作 SSH server webExec command scp 192.168.77.18:/root/.jenkins/workspace/probe/psi-probe-web/target/probe.war /usr/local/tomcat/webapps/ /usr/loca…

mysql基本操作

常用的数据类型 int 整型用于定义整数类型的数据float 单精度浮点4字节32位 准确表示到小数点后六位 double 双精度浮点8字节64位双精度浮点8字节64位char 固定长度的字符类型用于定义字符类型数据varchar可变长度的字符类型 text文本image图片de…

Java IO流(五)Netty实战[TCP|Http|心跳检测|Websocket]

Netty入门代码示例(基于TCP服务) Server端 package com.bierce.io.netty.simple; import io.netty.bootstrap.ServerBootstrap; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.*; import io.netty.channel.nio.NioEventLoopGro…

使用动态IP是否会影响网络

今天我们要谈论的话题是关于动态IP和网络的关系。也许有些小伙伴对这个概念还比较陌生&#xff0c;但别担心&#xff0c;我会简单明了的给你理清楚。让我们一起看看动态IP到底能否影响到网络。 首先&#xff0c;我们先来搞明白什么是动态IP。在互联网世界中&#xff0c;每一个连…