操作符详解(上)(新手向)

操作符详解(上)

  • 一,算术操作符(双目操作符)
    • 1:‘+’,‘-’,‘*’
    • 2:‘/’,‘%’
  • 一,单目操作符
    • 1:‘+’,‘-’
    • 2:‘!’
    • 3:‘&’
    • 4:‘*’
    • 5:‘sizeof’
    • 6:‘++’与‘--’
  • 三,移位操作符
    • 3.1 <<(左移操作符)
    • 3.2 <<(左移操作符)
    • 3.2 >>(右移操作符)
  • 四.位操作符
    • 4.1‘&’按位与
    • 4.2‘|’按位或
    • 4.3‘^’按位异或
    • 4.4‘~’按位取反

我们了解在C语言中有许多的操作符,这里我们详细介绍部分操作符

一,算术操作符(双目操作符)

1:‘+’,‘-’,‘*’

这三种算数操作符就相当于数学运算中的加法,减法,和乘法,是对两个数进行数学运算,

int a=1;
int b=2;
\\加法
int c=a+b;(结果为3)
\\减法
int c=b-a;(结果为1)
\\乘法
int c=a*b;(结果为2)

2:‘/’,‘%’

==‘/’==进行的操作相当于数学运算中的除法,但有些许不同,分为两种情况
第一种:当该操作符两端都为整形,结果也为整形,该操作符是将两数相除取商,例如5/3应该是商1余2,但结果只会显示商1
在这里插入图片描述
第二种:若想要输出的结果为小数,那么就需要除号两边之一为浮点数,并且输出的结果也要为浮点数,
在这里插入图片描述
‘%’ 进行的操作为将%号两边的数相除取余,例如5/3应该是商1余2,但结果只会显示余数2,
在这里插入图片描述
因为上述操作符运算所需变量为两个,也就是运算对象的个数是2,所以又被称作双目操作符。

一,单目操作符

1:‘+’,‘-’

这里的‘+’,‘-’并不是算数中的加号与减号,而是表示正数与负数,通常来说负数前会有‘-’号,而正数前的‘+’号通常省略。

2:‘!’

'!'为逻辑反操作符,用于对布尔值进行反转,举个例子:条件判断中,一般条件成立即为真,布尔值为非0,加上!后非0为假,0为真,也就是条件成立为假,不成立为真,我们设计一个简单的代码来看一下具体效果:

#include<stdio.h>
int main()
{int a = 0;while (scanf("%d", &a) != EOF){if (a > 0){printf("%d\n", a);}else{printf("NO\n");}}return 0;
}

在这里插入图片描述
这是没有加‘!’操作符时的结果,

#include<stdio.h>
int main()
{int a = 0;while (scanf("%d", &a) != EOF){if(!(a > 0)){printf("%d\n", a);}else{printf("NO\n");}}return 0;
}

在这里插入图片描述
这是加上!操作符后的结果。

3:‘&’

用于获取变量的内存地址。

4:‘*’

间接引用和解引用操作符,获取指针所指向的值。

5:‘sizeof’

用于获取数据类型或对象在内存中的大小(以字节为单位)
在这里插入图片描述

6:‘++’与‘–’

自增‘++’与自减‘–’,作用分别为将操作数的值增加1和减少1。
在实际操作中又分为前置和后置两种情况,
‘++’和‘–’前置为操作数先变化后使用,后置为操作数先使用后变化,如下图所示:

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

其输出结果为:
在这里插入图片描述

这里可以看到前置和后置操作符最终输出的结果并不相同。
介绍完C语言中比较简单的两种操作符,我们再来介绍一下比较复杂的操作符,位操作符

三,移位操作符

在介绍移位操作符前,还得先介绍十进制数字在计算机中的存储方式以及源码,反码,补码。

十进制数在计算机中通常不是直接储存的,而是先转化位二进制数在进行存储。而为了区分正负数,计算机对有符号整数采用了不同的编码储存方式,也就是源码反码补码

在现代的计算机中主要采用的数字集成电路完成,数字电路通过高低电平只能表示0和1,所以就出现了,计算机只会识别0和1。无论是存储还是计算,计算机均采用二进制体系完成。
在C语言中不同数据类型的大小不一样,如int类型每个占4个字节,而每个字节又等于8个比特位。
sizeof(int)=1byte=8bit每个比特位存储的便是0或1。
一个int类型共有32个比特位,每个比特位只能是0或1,也就是说在计算机中整型是采用二进制的方式存储的,那么int的取值范围便是-231~231-1
了解了上面的基本概念后,我们就来详细了解一下源码,反码和补码,
注意,源码,反码和补码只能应用在整数中
而正整数和负整数的存储是不一样的,我们分开讨论:
正整数:正整数的源码=反码=补码
负整数:负整数在计算机中是以补码的形式进行储存的,那么该如何得到负整数的补码?
首先,我们要了解计算机区分正,负整数的原理,在计算机中为了区分正负整数,在整形的32位比特位中,正整数的最高位比特位为0,而负整数的最高位为1,将负整数的源码除了最高位的符号位按位取反得到负整数的反码,反码加1得到负整数的补码。
下面以x64环境下的整型存储为例:

int a=5;
a的源码=反码=补码为:0000 0000 0000 0000 0000 0000 0000 0101
int b=-5;
b的源码为:1000 0000 0000 0000 0000 0000 0000 0101反码为:1111 1111 1111 1111 1111 1111 1111 1010补码为:1111 1111 1111 1111 1111 1111 1111 1011

而计算机之所以会有三种储存整形的方式的原因都是因为计算的难易,
源码的一个缺点是存在两种不同的表示方式来表示0(0000 和 1000),这可能导致一些不必要的复杂性。
反码的一个优点是消除了0的两种表示,但缺点是进行加减运算时相对复杂。
补码是最常用的表示法,特别是在现代计算机中。补码的一个主要优点是它使得加法运算更加简单,因为对于任何整数x,都有 x + (-x) = 0,这在补码表示下总是成立。另一个优点是只有一个0的表示(0000),这使得处理更加简单。
下面就介绍2种移位操作符:
>>(右移操作符)和<<(左移操作符)
注意:移位操作符的操作数只能是整数

3.1 <<(左移操作符)

3.2 <<(左移操作符)

移位规则:将整数的补码整体向左移动一位,左边的抛弃,右边空的补0;
演示:

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

输出结果:
在这里插入图片描述

移位图解:
在这里插入图片描述

3.2 >>(右移操作符)

右移操作符相对左移来说较为复杂,分为逻辑右移和算术右移
逻辑右移:左边⽤0填充,右边丢弃
逻辑右移一位图解:
在这里插入图片描述

算术右移:左边⽤原该值的符号位填充,右边丢弃
图解:
在这里插入图片描述
注意对于移位运算符,不要移动负数位,这个是标准未定义的

四.位操作符

注意:位操作符的操作数必须是整数

4.1‘&’按位与

该操作符在二进制层面上对两个数进行操作,它比较两个数的相应位,只有当两个相应的位都为1时,结果位才为1,否则为0;
代码和图解演示:

#include<stdio.h>
int main() 
{int num1 = 6;int num2 = 13;int num3 = num1 & num2;printf("%d\n", num3 );return 0;
}

在这里插入图片描述
在这里插入图片描述
图解:(前面为0的位省略)
在这里插入图片描述

4.2‘|’按位或

该操作符在二进制层面上对两个数进行操作,它比较两个数的相应位,只要两个数中任意一个数的相应位为1,那么结果位就为1,否则为0;
代码和图解演示:

#include<stdio.h>
int main() 
{int num1 = 2;int num2 = 13;int num3 = num1 | num2;printf("%d\n", num3 );return 0;
}

在这里插入图片描述

图解:(前面为0的位省略)
在这里插入图片描述

4.3‘^’按位异或

该操作符在二进制层面上对两个数进行操作,它比较两个数的相应位,当两个数的相应位不同时,结果位为1;当两个数的相应位相同时,结果位为0。
代码和图解演示:

#include<stdio.h>
int main() 
{int num1 = 3;int num2 = 13;int num3 = num1 ^ num2;printf("%d\n", num3 );return 0;
}

在这里插入图片描述

图解:(前面为0的位省略)
在这里插入图片描述

4.4‘~’按位取反

该操作符用于对二进制数的每一位执行逻辑非操作。具体地说,它将二进制数中的每个0变为1,每个1变为0。
代码和图解演示:

#include<stdio.h>
int main() 
{int num1 = 2;num1 = ~num1;printf("%d\n", num1 );return 0;
}

在这里插入图片描述

图解:(前面为0的位省略)
在这里插入图片描述

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

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

相关文章

linux 排查java内存溢出(持续更新中)

场景 tone.jar 启动后内存溢出,假设pid 为48044 排查 1.确定java程序的pid(进程id) ps 或 jps 都可以 ps -ef | grep tone jps -l 2.查看堆栈信息 jmap -heap 48044 3.查看对象的实例数量显示前30 jmap -histo:live 48044 | head -n 30 4.查看线程状态 jstack 48044

Spring 事件监听

参考&#xff1a;Spring事件监听流程分析【源码浅析】_private void processbean(final string beanname, fi-CSDN博客 一、简介 Spring早期通过实现ApplicationListener接口定义监听事件&#xff0c;Spring 4.2开始通过EventListener注解实现监听事件 FunctionalInterface p…

Rustdesk客户端源码编译

1.安装VCPKG windows平台vcpkg安装-CSDN博客 2.使用VCPKG安装: windows平台vcpkg安装-CSDN博客 配置VCPKG_ROOT环境变量: 安装静态库: ./vcpkg install libvpx:x64-windows-static libyuv:x64-windows-static opus:x64-windows-static aom:x64-windows-static 静态库安装成…

【C语言深度解剖】(15):动态内存管理和柔性数组

&#x1f921;博客主页&#xff1a;醉竺 &#x1f970;本文专栏&#xff1a;《C语言深度解剖》 &#x1f63b;欢迎关注&#xff1a;感谢大家的点赞评论关注&#xff0c;祝您学有所成&#xff01; ✨✨&#x1f49c;&#x1f49b;想要学习更多C语言深度解剖点击专栏链接查看&…

I.MX6ULL的官方 SDK 移植实验

系列文章目录 I.MX6ULL的官方 SDK 移植实验 I.MX6ULL的官方 SDK 移植实验 系列文章目录一、前言二、I.MX6ULL 官方 SDK 包简介三、硬件原理图四、试验程序编写4.1 SDK 文件移植4.2 创建 cc.h 文件4.3 编写实验代码 五、编译下载验证5.1编写 Makefile 和链接脚本5.2编译下载 一、…

列表元素添加的艺术:从单一到批量

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言 二、向列表中添加单一元素 1. append方法 2. insert方法 三、向列表中添加批量…

MySQL 存储过程(实验报告)

一、实验名称&#xff1a; 存储过程 二、实验日期&#xff1a; 2024 年5 月 25 日 三、实验目的&#xff1a; 掌握MySQL存储过程的创建及调用&#xff1b; 四、实验用的仪器和材料&#xff1a; 硬件&#xff1a;PC电脑一台&#xff1b; 配置&#xff1a;内存&#xff0…

Android 配置本地解决下载 Gradle 慢的问题

步骤1 打开项目下 gradle/wrapper/gradle-wrapper.properties 文件。 步骤2 文件内容如下。 #Sat May 25 16:24:00 CST 2024 distributionBaseGRADLE_USER_HOME distributionPathwrapper/dists distributionUrlhttps\://services.gradle.org/distributions/gradle-8.7-bin…

【Docker学习】深入研究命令docker exec

使用docker的过程中&#xff0c;我们会有多重情况需要访问容器。比如希望直接进入MySql容器执行命令&#xff0c;或是希望查看容器环境&#xff0c;进行某些操作或访问。这时就会用到这个命令&#xff1a;docker exec。 命令&#xff1a; docker container exec 描述&#x…

Jmeter预习第1天

Jmeter参数化&#xff08;重点&#xff09; 本质&#xff1a;使用参数的方式来替代脚本中的固定为测试数据 实现方式&#xff1a; 定义变量&#xff08;最基础&#xff09; 文件定义的方式&#xff08;所有测试数据都是固定的情况下[死数据]&#xff0c;eg:注册登录&#xff0…

Linux -- 进程间通信的五种方式

IPC&#xff08;InterProcess Communication&#xff09;的方式通常有管道&#xff08;包括无名管道和命名管道&#xff09;、消息队列、信号量、共享存储、Socket、Streams等。其中Socket和Stream支持不同主机上的两个进程IPC。 管道&#xff08;Pipes&#xff09;&#xff1a…

STM32中断编程入门

文章目录 一、 理论部分1.中断系统2.中断执行流程3.NVIC的基本结构4.EXTI介绍5.AFIO复用IO口 二、实验目的&#xff1a;学习stm32中断原理和开发编程方法。使用标准完成以下任务&#xff1a;&#xff08;一&#xff09;实验一 开关控制LED的亮灭1.代码部分2.运行结果 &#xff…

【简单易用,新人友好】一个轻量级生物信息学流程框架,从此解决99%的生物信息学流程搭建问题...

生物信息学数据分析流程的搭建是一项繁重而复杂的工作。随着行业的发展&#xff0c;各种生信流程框架层出不穷&#xff0c;比如有: NextflowSnakemakeCWLWDL 各种标准&#xff0c;各种规则&#xff0c;令人眼花缭乱。选择太多&#xff0c;往往令人无所适从。特别是新进入行业的…

小程序的深层了解

一:wxss的全局样式和局部样式 写在文件上,第一个路径会执行全局和局部自带的wxss给wxml,会执行wxml,会执行json和js. 无论那个文件都会执行文件夹内的和外部的app.wxss,但是如果有一样的属性,则看属性的权重,权重一样,则设置局部样式. 二:全局配置 wx:key"写的是data内…

17.7K星开源产品分析平台:Posthog

Posthog&#xff1a;开源洞察&#xff0c;产品优化的得力助手 - 精选真开源&#xff0c;释放新价值。 概览 PostHog是一个全面开源的平台&#xff0c;旨在帮助团队构建更好的产品。它提供了从产品分析到会话回放、功能标志和A/B测试等一系列工具&#xff0c;支持自托管&#x…

读人工智能时代与人类未来笔记14_管控人工智能

1. 管控人工智能 1.1. 历史上的战场进一步推进到与数字网络相连的所有地方 1.2. 数字程序现在控制着一个由众多实体系统构成的庞大且仍在不断增长的领域&#xff0c;而且越来越多的此类系统已实现网络化 1.2.1. 在某些情况下甚至连门锁和冰箱都实现了网络化 1.2.2. 这催生出…

2024年汉字小达人活动4个多月开赛:18道历年选择题和答案、解析

根据近年的安排&#xff0c;2024年第11届汉字小达人比赛还有4个多月就启动&#xff0c;那么孩子们如何利用这段时间有条不紊地备考呢&#xff1f;我的建议是两手准备&#xff1a;①把小学1-5年级的语文课本上的知识点熟悉&#xff0c;重点是字、词、成语、古诗。②把历年真题刷…

联想端游联运SDK接入指南

1. 接入流程 本文档主要介绍了 联想PC游戏SDK接入流程、联想游戏提供的功能、接入注意事项等。 1.1. 接入方式 1. 联想游戏SDK2.1版本支持“账号防沉迷支付”接入方式&#xff1b; a. 联想提供账号注册、登录等能力 b. 联想提供防沉迷服务 c. 联想提供游戏内支付 1.2. 对…

【学习笔记】计算机组成原理(八)

CPU 的结构和功能 文章目录 CPU 的结构和功能8.1 CPU的结构8.1.1 CPU的功能8.1.2 CPU结构框图8.1.3 CPU的寄存器8.1.4 控制单元CU和中断系统 8.2 指令周期8.2.1 指令周期的基本概念8.2.2 指令周期的数据流 8.3 指令流水8.3.1 指令流水原理8.3.2 影响流水线性能的因素8.3.3 流水…

数据库-SQL性能分析

SQL执行频率 慢查询日志 慢查询日志记录了所有执行时间超过指定参数&#xff08;long_query_time&#xff0c;单位&#xff1a;秒&#xff0c;默认10秒&#xff09;的所有 SQL语句的日志。 MySQL的慢查询日志默认没有开启&#xff0c;我们可以查看一下系统变量 slow_query_l…