jjzjj

菜鸟逆袭记之操作符详解

雨 子 2023-08-22 原文

菜鸟逆袭记之操作符详解

前言:
这一站与前面的 时空间有一定的联系,想了解更多内容请移步去看看

1.算术操作符

这里前面已经非常详细地讲解过了。如有不懂,请移步

2.移位操作符

(1)左移操作符

补充:

1.数据在内存中是以补码的形式存储的,而表达输出的结果是以原码的形式进行表达的。即操作符都是对补码进行操作的

2.正整数的原码,反码和补码是一样的

3.负整数的原码,反码,补码之间的关系是:
(1)反码=(除符号位外)按位取反
(2) 补码=反码+1




(2)右移操作符



注意:

对于移位操作符,

  1. 不要进行负数移位,这个标准是未定义的
  2. 只能进行整数的操作,不能进行小数的操作

3.位操作符

  • &(二进制补码)位与—有0就为0,两个1才为1 (相当于逻辑操作符的&&)
  • |(二进制补码)位或—有1就为1,两个0才为0 (相当于逻辑操作符的||)
  • ^(二进制补码)位异或—相同为0,相异为1

既然已经知道了原理,让我们做几道简单的题来练练手:

想必大家都有自己的答案了,让我们来看看正确答案与解题思路

下面,咱们上点难度:
实现不用额外的变量来实现两个数的交换


4.赋值操作符

这里前面已经非常详细地讲解过了。如有不懂,请移步

5.单目操作符

(1)取地址(&)

就前面的知识,在此补充:

  • 有地址都可以进行取地址
  • 在C语言中,变量,常量字符串,数组,结构体等在内存中都是有地址的,但字面常量(如 2)在内存中是没有地址的

(2)sizeof与数组

之前已经讲过不少这方面的内容,今天就着重讲一下sizeof 与数组

先看一下一下的代码分别输出什么:

运行结果:

解释一下:

(3)前置和后置

在这里,我们来讨论一下:先使用 后++,和先++后使用 的先后之分到底体现在哪里?

先后之分就体现在是否完成一个完整的语句

(3)按位取反(~)

~—按(二进制补码)位取反----符号位也取反


6.关系操作符

这里前面已经非常详细地讲解过了。如有不懂,请移步

7.逻辑操作符

在此,我们着重讲解一下逻辑操作分符的控制求值顺序

  • &&----左边为假,整体就为假–>右边无需计算
  • ||----左边为真,整体就为真–>右边无需计算
    有的课本称这种现象为短路

接下来,我们来一个例题练练手:

运行结果:

解释一下原因(要认真看哦)

那这个咱就明白了,再来一个巩固巩固吧:

运行结果:

怎么样,这个做对了吧。这个我也讲一下原因
解释一下原因(要认真看哦)


注意:

  1. 区分逻辑与(&&)和按位与(&)
  2. 区分逻辑或(||)和按位或(|)

8.条件操作符

这里前面已经非常详细地讲解过了。如有不懂,请移步

9.逗号操作符

  1. 逗号表达式,就是用逗号隔开的多个表达式
  2. 逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果



下面,来看一下这个逗号操作符在现实生活中的妙用:

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

这里前面已经非常详细地讲解过了。如有不懂,请移步

11.表达式求值

  1. 表达式求值的顺序一部分是由操作符的优先级和结合性决定
  2. 同样,有些表达式的操作数在求值的过程中可能需要转换为其他类型

(1)隐式类型转换

  1. C的整型算术运算总是至少以缺省整型类型的精度来进行的
  2. 为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升

表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度
一般就是int的字节长度,同时也是CPU的通用寄存器的长度
因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度
通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsigned int,然后才能送入CPU去执行运算

整形提升的规则:

我们来一点例题来巩固一下:
例子1:

  • a,b要进行整形提升,但是c不需要整形提升
  • a,b整形提升之后,变成了负数,所以表达式 a,b的结果是假,但是c不发生整形提升,则表达式 c==0xb6000000 的结果是真

例子2:

  • 整型提升这种场景大部分就是两个不同类型之间进行加减乘除 或者比较之类的, 场景不是特别多, 目前先了解这么多, 后边遇到问题可以在具体分析
  • 整形提升的前提是变量的类型是小于整形(int)的类型,在进行表达式运算(即运用操作符时),不足整形的变量要进行整形提升

(2)算术转换

如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类型,否则操作就无法进行。下面的层次体系称为寻常算术转换

  • 但是算术转换要合理,要不然会有一些潜在的问题

(3)操作符的属性

下面我来举例一个问题表达式,以此来证明优先级和结合性都已确定,但先后顺序还是不确定的


让我来解释一下吧:

总结:我们写出的表达式如果不能通过操作符的属性确定唯一的计算路径,那这个表达式就是存在问题的。-------即我们写代码时不要吝啬括号()

有关菜鸟逆袭记之操作符详解的更多相关文章

  1. ruby - 如何使用 Selenium Webdriver 根据 div 的内容执行操作? - 2

    我有一个使用SeleniumWebdriver和Nokogiri的Ruby应用程序。我想选择一个类,然后对于那个类对应的每个div,我想根据div的内容执行一个Action。例如,我正在解析以下页面:https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=puppies这是一个搜索结果页面,我正在寻找描述中包含“Adoption”一词的第一个结果。因此机器人应该寻找带有className:"result"的div,对于每个检查它的.descriptiondiv是否包含单词“adoption

  2. ruby-on-rails - 如何处理 Grape 中特定操作的过滤器之前? - 2

    我正在我的Rails项目中安装Grape以构建RESTfulAPI。现在一些端点的操作需要身份验证,而另一些则不需要身份验证。例如,我有users端点,看起来像这样:moduleBackendmoduleV1classUsers现在如您所见,除了password/forget之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如passwords并且只是删除password/forget从逻辑上讲,这个端点应该与用户资源。问题是Grapebefore过滤器没有像except,only这样的选项,我可以在其中说对某些操作应用过滤器。您通常如何干净利落地处理这种情况?

  3. ruby-on-rails - 在 Ruby on Rails 中发送响应之前如何等待多个异步操作完成? - 2

    在我做的一些网络开发中,我有多个操作开始,比如对外部API的GET请求,我希望它们同时开始,因为一个不依赖另一个的结果。我希望事情能够在后台运行。我找到了concurrent-rubylibrary这似乎运作良好。通过将其混合到您创建的类中,该类的方法具有在后台线程上运行的异步版本。这导致我编写如下代码,其中FirstAsyncWorker和SecondAsyncWorker是我编写的类,我在其中混合了Concurrent::Async模块,并编写了一个名为“work”的方法来发送HTTP请求:defindexop1_result=FirstAsyncWorker.new.async.

  4. ruby - 在 Ruby 中是否有一种惯用的方法来操作 2 个数组? - 2

    a=[3,4,7,8,3]b=[5,3,6,8,3]假设数组长度相同,是否有办法使用each或其他一些惯用方法从两个数组的每个元素中获取结果?不使用计数器?例如获取每个元素的乘积:[15,12,42,64,9](0..a.count-1).eachdo|i|太丑了...ruby1.9.3 最佳答案 使用Array.zip怎么样?:>>a=[3,4,7,8,3]=>[3,4,7,8,3]>>b=[5,3,6,8,3]=>[5,3,6,8,3]>>c=[]=>[]>>a.zip(b)do|i,j|c[[3,5],[4,3],[7,6],

  5. ruby-on-rails - 如何让 Rails View 返回其关联的操作名称? - 2

    我有一个非常简单的Controller来管理我的Rails应用程序中的静态页面:classPagesController我怎样才能让View模板返回它自己的名字,这样我就可以做这样的事情:#pricing.html.erb#-->"Pricing"感谢您的帮助。 最佳答案 4.3RoutingParametersTheparamshashwillalwayscontainthe:controllerand:actionkeys,butyoushouldusethemethodscontroller_nameandaction_nam

  6. ruby-on-rails - 为什么 Rails 菜鸟不应该使用 Gem Devise? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我是ruby​​onrails菜鸟。相比之下,我的HTMLCSSjavascript和jQuery相当不错。最近我使用MichaelHartl的教程进入了RubyonRails:http://ruby.railstutorial.org/ruby-on-rails-tutorial-book.但是,唉,我正在尝试构建自己的项目并使用gemdevise作为进

  7. 物联网MQTT协议详解 - 2

    一、什么是MQTT协议MessageQueuingTelemetryTransport:消息队列遥测传输协议。是一种基于客户端-服务端的发布/订阅模式。与HTTP一样,基于TCP/IP协议之上的通讯协议,提供有序、无损、双向连接,由IBM(蓝色巨人)发布。原理:(1)MQTT协议身份和消息格式有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。MQTT传输的消息分为:主题(Topic)和负载(payload)两部分Topic,可以理解为消息的类型,订阅者订阅(Su

  8. Postman测试简单操作 - 2

    1、接口请求基本操作1.1例子tips在view的选项可以zoomin调整窗口字帖大小。1、创建一个测试的workspace,并命名为test2、test后面新增一个addrequest3、选择发送GET,URL为一个开源的https://api.apiopen.top/api/sentences获取每日一句4、点击send查看内容Tips:如果提示出现Error:tunnelingsocketcouldnotbeestablished,statusCode=407错误,参照以下解决办法)关于tunnelingsocketcouldnotbeestablished,cause=getaddri

  9. Tcl脚本入门笔记详解(一) - 2

    TCL脚本语言简介•TCL(ToolCommandLanguage)是一种解释执行的脚本语言(ScriptingLanguage),它提供了通用的编程能力:支持变量、过程和控制结构;同时TCL还拥有一个功能强大的固有的核心命令集。TCL经常被用于快速原型开发,脚本编程,GUI和测试等方面。•实际上包含了两个部分:一个语言和一个库。首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些互交程序如文本编辑器、调试器和shell。由于TCL的解释器是用C\C++语言的过程库实现的,因此在某种意义上我们又可以把TCL看作C库,这个库中有丰富的用于扩展TCL命令的C\C++过程和函数,所以,Tcl是

  10. 【Linux操作系统】——网络配置与SSH远程 - 2

    Linux操作系统——网络配置与SSH远程安装完VMware与系统后,需要进行网络配置。第一个目标为进行SSH连接,可以从本机到VMware进行文件传送,首先需要进行网络配置。1.下载远程软件首先需要先下载安装一款远程软件:FinalShell或者xhell7FinalShellxhell7FinalShell下载:Windows下载http://www.hostbuf.com/downloads/finalshell_install.exemacOS下载http://www.hostbuf.com/downloads/finalshell_install.pkg2.配置CentOS网络安装好

随机推荐