操作符 | C语言中操作符详解 | 操作符的优先级 | 移位操作法的使用方式

一、算术操作符:+、-、*、/、%

算术操作符其实在平时生活中,也遇到很多,并且这五类操作符基本很常见,而他们的作用与数学所学习的功能是一样的。但是“/”除号操作符与“%”取模操作符有些不同。下面就以这两个的操作符为主要说起。

1.1 “ / ” 除号

对于 “ / ” 除号操作符来说,如果操作符的两个操作数都是整数,那就执行整数除法,所得到的结果也是整数除法。而操作数只要有浮点数,那么就是浮点数除法

int m = 7 / 3;

运行结果为:2 

上面的代码中,因为7和3都是整形类型的,所以执行整数除法,所以得到的结果为2。

1.2 “ % ” 取模(求余数)

对于 “ % ” 取模操作符而言,它的操作数必须为整数,并且返回的是两个整数相除之后的余数。

int m = 7 % 3;

运行结果为:1 

二、移位操作符:“<<”左移 “>>”右移

移位操作符移动的是二进制的位。

2.1 补充知识:原码、反码和补码

整数的二进制的表现形式有:原码、反码和补码。在计算机存储的过程中,都是以数的补码进行存储,并且在计算机中的操作以及打印也都利用补码进行,一个整数是4个字节(1字节=8比特位),就有32个比特位。

原码:按照数值的正负,直接写出的二进制序列就是原码。

反码:原码的符号位不变,其他位按位取反。

补码:反码的二进制加1。

而对于有符号的整数来说,最高一位的位是符号位。符号位为 “ 1 ” 表示负数,符号位为 “ 0 ” 表示正数。

对于无符号的整数来说,没有符号位,所以每一位都是有效的。

有符号的整数中正数与负数又有所差别:

  • 整数的原码、反码和补码的值相同
  • 整数的原码、反码和补码的值不同

所以在遇到负整数,就要通过运算来进行分析。

2.2 “ << ” 左移操作符

“ << ” 左移操作符,顾名思义,就是向左移动,将二进制的数向左移动。

“ << ” 左移操作符 使用方法:左边丢弃,右边补0

以下面这个例子来说:

int m = 7;
int n = m << 1;

运行结果为:14 

7是正整数,所以它的原码、反码以及补码相同,它的二进制的写法是:

00000000 00000000 00000000 00000111

向左移动一位,给右边的补充0之后:

00000000 00000000 00000000 00001110

所以得到的这个结果就是14。

int m = 56;
int n = m << 1;

运行结果为:112 

int m = -10;
int n = m << 1;

运行结果为:-10 

所以不论正负,某一个数左移一位,会得到它的二倍。

2.3 “ >> ”右移操作符

“ << ”左移操作符作用效果是:左边丢弃,右边补0;那么“ >> ”右移操作符作用效果会不会就是:右边丢弃,左边补0呢?

我们刚刚说过,有符号整数在二进制的位上是有一些差异的,如果一个整数是有符号的f负数,那么最高位就是它的符号位,那么在经过右移之后,它的最高位就缺失了,那么我们还是补0吗?那么它还会不会是负数呢?

在“ >> ”右移操作符中,是有两种情况的。

“ >> ”逻辑右移

“ >> ” 逻辑右移操作符 使用方法:右边丢弃,左边补0 

“ >> ”算术右移

“ >> ” 算术右移操作符 使用方法:右边丢弃,左边补符号位

在大多数编译器中都使用的是算术右移。

例如:

int m = -10;
int n = m >> 1;

运行结果为:-5 

三、位操作符:&、|、^ 

位操作符与移位操作符也都是在2进制的位上进行运算的。并且位操作符的操作数必须都是整数。

3.1 “ & ” 按位与

“ & ” 按位与 使用口诀:两个同时为1,则为1

在按位与的作用下,我们只看两个数的相同为是否同时为1,如果是,那么就是1;如果不是,那么就是0。

例如:

int a = 3; int b = -5;
int c = a & b;

运行结果为:3 

-5的原码:00000000  00000000  00000000  00000101

-5的反码:111111111  111111111  111111111  11111010

-5的补码:111111111  111111111  111111111  11111011

3的补码: 00000000  00000000  00000000  00000011

3 & -5   : 00000000  00000000  00000000  00000011

因为按位与之后的结果最高位是“0”,那么就是正数,正数的原码、反码和补码是相同的。所以将上面的二进制转化为十进制之后,结果就是-3。

“ & ” 逻辑与 小技巧:任何数&1===》得到它的最低位

这个小技巧真的很实用,希望大家能够记住。 

3.2 “ | ” 按位或

“ | ” 按位或 使用口诀:有1则为1

在按位或的作用下,我们只看两个数中有一个数为1,那么就是1;如果两个数都是0,那么就是0。

例如:

int a = 3; int b = -5;
int c = a | b;

运行结果为: -5

-5的补码:111111111  111111111  111111111  11111011

3的补码: 00000000  00000000  00000000  00000011

3 | -5   : 11111111  11111111  11111111  11111011

按位或之后的结果最高位是“1”,所以是负数,负数的原码、反码和补码不同,所以需要转换为原码。这里附上一张原码、反码和补码的转化方式来便于大家理解。

补码:11111111  11111111  11111111  11111011 

反码:11111111  11111111  11111111  11111010

原码:10000000 00000000 00000000 00000101

所以通过原码可得,最终的结果是-5。

3.3 “ ^ ” 按位异或

“ ^ ” 按位与 使用口诀:相同为0,相异为1

在按位与的作用下,我们看两个数相同的话,那么就是0;两个数不同的话,那么就是1。

例如:

int a = 3; int b = -5;
int c = a ^ b;

运行结果为:-8

-5的补码:111111111  111111111  111111111  11111011

3的补码: 00000000  00000000  00000000  00000011

3 ^ -5   : 11111111  11111111  11111111  11111000

因为所得的值是负数(符号位为“1”),所以是负数,负数的原码、反码和补码不同,所以需要转换为原码。

补码:11111111  11111111  11111111  11111000 

反码:10000000 00000000 00000000 00000111

原码:10000000 00000000 00000000 00001000

所以通过原码可得,最终的结果是-8。

四、赋值操作符:=  

赋值操作符很简单,就是在变量创建之后,重新赋值。

int a=1;//不是赋值,是初始化
a=20;   //赋值

还有一些复合赋值符中,有一些简易的写法:

a=a>>1;
//可以写为
a>>=1;

五、单目操作符:! 、&、-、+、++--前置后置、sizeof、~、*、(类型)

5.1 “ ! ”逻辑反操作

其实逻辑反操作也是我们常常使用的。“天是蓝色”这句话是真的,但是如果在这句话的前边加上逻辑反操作之后,那么这句话就不是真的了“!天是蓝色”,天就不是蓝色的了。

int flag=0;
if(!flag)
{printf("hehe");
}

运行结果为:hehe 

因为在计算机中,0表示假,非0表示真,所以!flag就会是真的。 

5.2 “ & ”取地址

“&”这里是取地址,大家不要和按位与“&”沦为一谈,按位与“&”是双目操作符,而取地址“&”是单目操作符。

例如:

int a = 10;
&a;//变量的地址
int arr[10];
&arr;//数组的地址

5.3 “ sizeof ” 操作数类型长度

sizeof要注意的几个点:

  • sizeof 不是函数,而是操作符;
  • sizeof计算的结果是size_t类型的,size_t是无符号整型,对于size_t类型的数据进行打印,可以使用%zd,而在一些老的编译器下,可以使用%u进行打印。
  • sizeof是计算类型创建变量的大小或者变量的大小,单位是字节。

这里注意,“ sizeof ”不是函数,而是操作符。

int a = 10;
printf("%zd\n", sizeof(a));
printf("%zd\n", sizeof(int));
printf("%u\n", sizeof(int));

运行结果为:4 4 4 

5.4 “ ~ ” 按位取反

按位取反就是对一个数的二进制按位取反。 

“ ~ ” 按位取反 使用口诀:包括符号位,全部取反

例如:

int a = 2;
int b = ~a;

运行结果为:-3 

5.5 “ * ” 间接访问操作符(解引用操作符)

“ * ” 间接访问操作符适用于指针,以下面的代码来说,*p是通过p存放的地址,来找到p指向的对象,*p其实也就是a。

int a = 10;
int * p = &a;

5.6 “ 类型 ” 强制类型转换

强制类型转化,顾名思义就是将一个类型转化为另一个类型,例如:

int a = (int)3.14;
printf("%d", a);

运行结果为:3 

六、关系操作符:>、>=、<、<=、!=、==

关系操作符都很简单,唯一需要强调的一点就是,在编写代码的时候,切记将等于“==”写为赋值“=”,这两个是完全不同的。 

七、逻辑操作符:&&、||

7.1  “ && ”逻辑与

“ && ”逻辑与 :左右都为真,才为真

左边操作数如果为假,右边无需计算

int a = 0;
int b = 5;
int c = a && b;//0-全真为1,否则为0

 7.2 “ || ”逻辑或

“ || ”逻辑或:左右只要有一个真的,那就是真的

左边操作数如果为真,右边无需计算

int a = 0;
int b = 5;
int d = a || b;//1-有真为1,全假为0

八、条件操作符:“?:”

条件操作符也是唯一的三目操作符。

exp1?exp2:exp3
对语句1判断,为真则语句2,为假则语句3。

例如:

int a = 1;
int b = 5;
int m = 0;
m = (a > b ? a : b);//5

运行结果为:5

九、逗号表达式:“,”

逗号表达式,从左向右依次执行,整个表达式的结果是最后一个表达式的结果。

int a=1;
int b=2;
int c=(a>b,a=b+10,a,b=a+1);

运行结果为:13 

这种情况下,每一条语句都是执行的,但是最终结果是最后一个语句。 

十、下标引用、函数调用和结构体成员操作符

10.1 “ [] ”下标引用操作符

“ [] ”下标引用操作符,适用于数组中,访问数组元素个数。数组下标是从0开始。

int arr={1,2,3,4,5,6,7,8,9,10};
printf("%d\n",arr[5]);

运行结果为:6

10.2 “()”函数调用操作符

“()”函数调用操作符,在调用函数的时候,是不能缺少的。

printf("hello\n");//调用库函数

10.3 “ . ” “->”成员访问操作符

“ . ” “->”成员访问操作符,多用于结构体访问中。

成员访问操作符 使用方法:

结构体 . 成员名

结构体指针 -> 成员名

struct Book
{char name[20];int price;
};int main()
{struct Book b = { "《加油》",66 };printf("%s %d\n", b.name, b.price);return 0;
}

运行结果: 《加油》 66


以上就是我们需要掌握的操作符了,大家可以收藏,多多翻看哦~祝大家都拿到心仪的offer~

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

伟大不能被计划

假期清理书单&#xff0c;把这个书读完了&#xff0c;结果发现出奇的好&#xff0c;可以说是值得亲身去读的书&#xff0c;中间的一些论述提供了人工智能专业方面的视角来论证这这个通识观点&#xff0c;可信度很不错&#xff1b; 这篇blog也不是对书的总结&#xff0c;更多的是…

asp.net班级管理系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net班级管理系统 是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c#语言开发 asp.net班级管理系统 二、功能介绍 1…

Pikachu靶场——目录遍历漏洞和敏感信息泄露

文章目录 1. 目录遍历漏洞1.1 源码分析1.2 漏洞防御 2. 敏感信息泄露2.1 漏洞防御 1. 目录遍历漏洞 漏洞描述 目录遍历漏洞发生在应用程序未能正确限制用户输入的情况下。攻击者可以利用这个漏洞&#xff0c;通过在请求中使用特殊的文件路径字符&#xff08;如 …/ 或 %2e%2e…

Electronjs入门-Electron中的主要模块

在本节中&#xff0c;我们将了解在Electron中创建任何应用程序时的一些基本模块&#xff1b;这些模块多种多样&#xff0c;使我们能够轻松地进行进程通信&#xff0c;创建操作系统的本地菜单。 为了利用Electron模块&#xff0c;以及任何第三方或Node模块&#xff0c;不仅在主流…

SSM - Springboot - MyBatis-Plus 全栈体系(二十一)

第四章 SpringMVC 四、RESTFUL 风格设计和实战 1. RESTFul 风格概述 1.1 RESTFul 风格简介 RESTful&#xff08;Representational State Transfer&#xff09;是一种软件架构风格&#xff0c;用于设计网络应用程序和服务之间的通信。它是一种基于标准 HTTP 方法的简单和轻量…

visual studio解决bug封装dll库

1.速度最大化 O2 2.设置输出目录 配置属性/常规/输出目录 链接器/常规/输出dll文件 链接器/调试/输出程序数据库pdb文件 链接器/高级/导入库 3.输出X86 X64分别对应的dll、lib、pdb 然后修改更新说明 更新说明格式如下&#xff1a; 4.将库提交到FTP每日更新库文档下 和测试交接…

[NISACTF 2022]hardsql - quine注入

题目描述&#xff1a;$password$_POST[passwd]; $sql"SELECT passwd FROM users WHERE usernamebilala and passwd$password;"; 从描述看出是quine注入&#xff0c;且用户名要是bilala 1、经测试&#xff0c;参数为&#xff1a;username&passwd&login登录&a…

36.骑士周游算法及其基于贪心算法的优化

概述 骑士周游算法&#xff0c;叫做“马踏棋盘算法”或许更加直观。在国际象棋8x8的棋盘中&#xff0c;马也是走“日字”进行移动&#xff0c;相应的产生了一个问题&#xff1a;“如果要求马 在每个方格只能进入一次&#xff0c;走遍全部的64个方格需要如何行进&#xff1f;”…

1147. 段式回文

链接&#xff1a; ​​​​​​1147. 段式回文 题解&#xff1a; class Solution { public:int longestDecomposition(string text) {MOD 1e9 7;if (text.size() < 0) {return 0;}// 初始化26的n次方的表pow26.resize(text.size());pow26[0] 1;for (int i 1; i < …

【C语言】利用数组处理批量数据(字符数组)

前言:前面已经介绍了&#xff0c;字符数据是以字符的ASCII代码存储在存储单元中的&#xff0c;一般占一个字节。由于ASCII代码也属于整数形式&#xff0c;因此在C99标准中&#xff0c;把字符类型归纳为整型类型中的一种。 &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x…

数据结构——红黑树(详解性质+C++模拟)

文章目录 前言红黑树的概念红黑树的性质红黑树结点的定义红黑树的插入操作1. **按照二叉搜索树的规则插入新结点**2. 检测新节点插入后&#xff0c;红黑树的性质是否遭到破坏 红黑树的验证总结 前言 本篇博客将为大家重点讲述红黑树这一数据结构&#xff0c;讲解其实现的方式即…

One Thread One Loop主从Reactor模型⾼并发服务器

One Thread One Loop主从Reactor模型⾼并发服务器 文章目录 One Thread One Loop主从Reactor模型⾼并发服务器一些补充HTTP服务器Reactor 模型eventfd通用类Any 目标功能模块划分&#xff1a;SERVER模块Buffer模块&#xff1a;编写思路&#xff1a;接口设计&#xff1a;具体实现…

毕设-原创医疗预约挂号平台分享

医疗预约挂号平台 不是尚医通项目&#xff0c;先看项目质量&#xff08;有源码论文&#xff09; 项目链接&#xff1a;医疗预约挂号平台git地址 演示视频&#xff1a;医疗预约挂号平台 功能结构图 登录注册模块&#xff1a;该模块具体分为登录和注册两个功能&#xff0c;这些…

Linux:环境变量、地址空间

目录 一、环境变量 1、什么是环境变量 2、常见的环境变量 3、环境变量相关命令 二、地址空间 1、进程地址空间 2、虚拟地址空间 一、环境变量 1、什么是环境变量 首先先举个环境变量的例子&#xff1a; 我们在Linux中&#xff0c;运行ls、pwd之类的命令&#xff0c;直…

力扣 -- 873. 最长的斐波那契子序列的长度

解题步骤&#xff1a; 参考代码&#xff1a; class Solution { public:int lenLongestFibSubseq(vector<int>& nums) {int nnums.size();unordered_map<int,int> hash;for(int i0;i<n;i){hash[nums[i]]i;}int ret2;vector<vector<int>> dp(n,v…

Python之元组

Python之元组 元组tuple 一个有序的元素组成的集合使用小括号 ( ) 表示元组是不可变对象 tuple(), (), type(()) # 空元组 ((), (), tuple)(1,), (1) # 元组中只有1必须加逗号&#xff0c;否则就是1了 # ((1,), 1)x 1, 2 # 以逗号分隔的内容会形成元组&#xff0c;封装元组x…

DBC配置SecOC属性

关联文章:Autosar基础——车载信息安全SecOC 属性定义的规范详细介绍请参考 ①dbc属性定义 ②Vector DBC属性定义规则 文章目录 一、SecOC简介二、DBC文件中的SecOC属性三、配置SecOC属性设置SecOC的属性设置同步报文的属性设置同步请求报文的属性一、SecOC简介 在车载网络中…

数据分析篇-数据认知分析

一简介 数据认知分析&#xff0c;实际是对数据的整体结构和分布特征进行分析&#xff0c;是对整个数据外在的认识&#xff0c;也是数据分析的第一步。对于数据认知的分析&#xff0c;一般会考虑分散性、位置特性、变量的相关性等&#xff0c;一般会考虑平均数、方差、极差、峰…

朋友圈怎么定点发朋友圈?

微信朋友圈是我们日常生活中常用的社交媒体之一。但有时我们忙碌而可能会忘记发布朋友圈&#xff0c;或是因时间不合适而无法发布。那么&#xff0c;有没有一种方法可以在规定的时间内自动发布朋友圈呢&#xff1f; 当然有啦&#xff01; 定时发朋友圈可以帮助我们在特定时间点…

7.Tensors For Beginneers - Convector Components

介绍协向量时&#xff0c;曾说过它们有点像 行向量&#xff0c; 行向量确实以某种方式代表了协向量&#xff0c; 这里说明一下&#xff1a; 协向量是不变的&#xff1b; 协向量组件是可变的。 协向量不依赖坐标系&#xff0c;协向量的组件取决于坐标系。 当我们说协向量具有组…