哈喽,我又来了~

昨天的《5. 很“迷”的字符与字符串》初稿本来很短的,但是我觉得内容太少了,就加了一些,结果好像就变得特别多〒▽〒。

内容提要:本文将主要介绍算术运算符、关系运算符和逻辑运算符这三种运算符。具体内容包括运算优先级比较,短径求值,还有一条便于记忆的终极结论哦~今天推送的第三篇文章附加了C语言优先级速查表。

文章正文约2500字,阅读约15分钟。

1

算术运算符

算术运算符就是做加减乘除运算的运算符,常见的运算符有如下这些

其中有三点需要注意

整数间的除法采用的是取整的方式,而不是四舍五入的方式,如 5/3 = 1

浮点数间的除法则能获得一个相对逼近结果的值,如5.0/3.0 = 1.666667

求余运算符要求 % 两边的操作数都要是整数,其结果也是整数。

1.1

什么是 “目”

上面的表格中有双目运算符,也有单目运算符,那什么是 “目” 呢?如下图所示

其中加号是运算符,被运算符作用的运算对象称之为操作数,比如 1 + 2,那么 1 和 2 就是被加法运算符(+)作用的两个操作数。所以运算符是双目的还是单目的,要看其操作数的个数。很明显,在算术运算符中除了正负号运算符,剩下的都是双目运算符。

1.2

运算符的表达式及优先级

用运算符和括号将操作数连接起来的式子,我们称之为表达式。比如1+2,'a'+'b',1+2+-1-9%5。

对于较为复杂的表达式我们需要考虑运算符的优先级和结合性,大部分的运算符和我们的认识一致,比如先乘除后加减,有括号的先算括号内的。但是也会有一些较为特殊的运算符需要我们注意下计算的顺序,在今天文章的第三条我们给出一个参考,可以快速查看运算符号的优先级。顺便在这里我也安利下我常用的方法,很简单!就是遇到不确定的优先级直接用括号把想优先计算的括起来~

1.3

运算中的类型转换

当一个运算符的几个操作数类型不同时(如 1 + 1.5),编译器需要将它们转换为共同的某种数据类型,才能进行运算。通常情况下,编译器会将占内存比较小的操作数,先转换为与占内存较大的操作数的相同类型,然后再进行运算。这样做的目的就是为了确保计算的精确度。

此外C 语言还允许你强制转换操作数的数据类型,具体的是在操作数的前边用小括号将目标数据类型括起来,如int(1.6)。

1.4

举例说明

第一个程序是关于运算优先级的示例

实验结果为i=3j=7和k=17

其中需要注意的是 -1 中的负号优先级很高,在 C 语言中排在第二优先级,而我们常用的乘除排在第三优先级,加减排在第四优先级。

第二个程序是关于类型转换的示例

实验结果如下图所示

从输出的第一行可以看到,整数的取整是对它的绝对值取整再加上符号,-2.5 会取整为 -2,而 2.5 会取整为 2。

gcc 对第二个printf中的内容进行了警告,大概意思是说我们将一个double类型的变量以 int 型进行打印输出,可以看到输出的结果明显是不对的。

如果想输出 1 + 2.8 的整型形式的结果,可以先通过(int) 2.8强制将其转变为整型再进行相加,也可以将相加的结果直接强制转变为整型。

2

关系运算符

如下图所示,可以使用关系运算符来比较两个数的大小关系

其中同一个大括号中的关系运算符的优先级相同,上面的优先级要高于下面的优先级。用关系运算符将两边的变量、数据或表达式连接起来,称之为关系表达式,如下所示打印出每一个关系表达式的值

执行程序将会打印输出 1 1 0 0 1 0

当关系表达式成立的时候会返回数字 1 ,不成立的时会返回数字 0 。其中整型的变量和整型的常量之间进行关系运算是很好理解的,但是字符型变量是如何进行比较的呢?很简单通过字符型变量所对应的 ASCII 码。

但是倒数第二个中的字符串是如何比较大小的呢?你可以先思考一下,在下面我们会给出答案~<( ̄︶ ̄)>~

3

逻辑运算符

C语言总共提供了三种逻辑运算符,如下图所示

首先要注意它们之间的优先级,因为逻辑非是一种单目运算符,而剩下的两种是双目运算符,所以逻辑非的优先级最高。用逻辑运算符将两边的变量、数据或表达式连接起来,称之为逻辑表达式,如下为打印出每一个关系表达式的值

通过之前文章我们知道关系运算符的优先级要高于逻辑运算符,所以第一个 printf 中的内容显然为真;在第二个printf中||左侧的是3+1 ,实际上在 C 语言中任意非零数字都可以算作是真,所以该语句名明显应该输出 1 ;剩下的几个例子很好理解可以自行推导一下。

执行上面的代码结果为 1 1 0 0 1

3.1

短路求值

短路求值又称最小化求值,是一种逻辑运算符的求值策略。只有当第一个运算数的值无法确定逻辑运算的结果时,才对第二个运算数进行求值。C语言对于逻辑与和逻辑或采用短路求值的方式。

比如说在 3>1 && 1<2 只根据前半部分是没有办法判断该表达式的取值的,所以还有根据后面的运算数求值;但是对于 3 == 1 && 1 < 2 来讲,根据第一个运算数字就可以判断该逻辑表达式为假,所以后面的比较运算就不会发生。

字符串的比较方法就是遵从了这个原则。符串比较就是从两个字符串第一个位置开始比较对应位置上的字符的ASCII码值,直到分出大小或者达到某个字符串的结尾,先到达结尾的字符串小。例如: “AC”<“B” 因为A的ASCII码值比B小,那么后面的就不在比较了 “ACA”<“ACAX” 前面三个"ACA"都相同,最后一个前面的字符串已到末尾,所以小。

又比如下面这个例子

它的运行结果为

这是因为执行到 a=0 的时候已经可以得到 (a=0) && (b=5); 所以后面的 b= 5 就不会被执行因此输出 a = 0, b = 3;下面的同样当执行到 a = 1 就已经的到了 (a = 1) || (b = 5) 的值,所以仍然不会执行 b = 5 ,打印输出 a = 1, b = 3 。所以在采用逻辑运算表达式的时候一定要考虑清楚在逻辑运算符的左右应该分别放什么。

4

终极结论!

如果你觉得上面的内容太多很难记?没关系,呆博同学给出了一个便于记忆的终极结论!

! > 算术运算符 > 关系运算符 > && > || > 赋值运算符

好了~今天的内容就到这里了。还是老样子哦,如果喜欢就点赞转发支持一下,如果觉得哪里不好,果断留言批评就是啦~

参考

[1]“小甲鱼” 视频课程《带你学C带你飞》【第一季】P9 P10

[2] 百度知道 《C语言中比较字符串大小的判断标准是什么?》

原文发布时间为:2018-10-12

本文作者:独孤呆博

本文来自云栖社区合作伙伴“轮子工厂”,了解相关信息可以关注“轮子工厂”。

6. 简单又复杂的“运算符”,建议你看一哈相关推荐

  1. sql的加减乘除运算_SQL简单查询语、运算符学习和练习

    本次主要学习了SQL语言的书写和运算,多为实操,一定要多写多思考,综合运用起来. 基本查询语句(select *全部 as替换 distinct删除重复) 指定查询条件(where 从哪里查询) 注释 ...

  2. clob和blob是不是可以进行模糊查询_SQL简单查询语、运算符学习和练习

    本次主要学习了SQL语言的书写和运算,多为实操,一定要多写多思考,综合运用起来. 基本查询语句(select *全部 as替换 distinct删除重复) 指定查询条件(where 从哪里查询) 注释 ...

  3. PS入门基础教程之简单背景抠图讲解,建议收藏!

    很多新手小白在接触PS的时候最想学习的就是抠图,但是用钢笔抠图什么的都太麻烦,也抠不好,抠着抠着就放弃了.今天小编给新手小白们来一个超简单的背景抠图,看一次就会了!光说不练假把式,来,看教程! 一.首 ...

  4. 国外大牛教你,如何用Python开发一个简单的区块链数据结构| 建议收藏

    来源 | Medium 作者 | arjuna sky kok 整理 / Aholiab 出品 | 区块链大本营(blockchain_camp) 根据IEEE此前的一项调查,Python已成为最受开 ...

  5. C# 超简单的左/右移运算符理解

    最近很多人问我运算符理解起来感觉好难啊, 每个数都要换成二进制然后慢慢算, 很多老师都是会这样教底层的计算方式... 我在理解底层的计算方式上总结了一些. 请看... 1.<< 左移操作符 ...

  6. excel按颜色求和,终于有最简单的方法了,建议收藏

    excel在我们的日常办公中很常见,很多时候我们在记录报表的时候重要的内容都会用不同的颜色进行标记,当我们在给这些不同颜色进行求和的时候应该使用什么方法呢?难道要一个一个的进行计算吗?其实并不用,下面 ...

  7. java自学——java的基本讲解和变量、字符串、运算符的简单介绍

    java自学--java的基本讲解和变量.数组.字符串.运算符的简单介绍 hello world程序 java程序的结构 java语句的组成介绍 关键字 标识符 标识符的命名规则 分隔符 注释符 空白 ...

  8. c++重载运算符_Chapter13:重载——入门(一)

    一.走进重载 所谓重载,就是赋予新的含义.函数重载(Function Overloading)可以让一个函数名有多种功能,在不同情况下进行不同的操作.运算符重载(Operator Overloadin ...

  9. C语言合理字符的代码,改善C语言程序代码的125个建议,第62到89个建议!

    大家好,我是阿叔,专注分享产品.研发.管理等相关经验. 一共有125个改善C语言程序的建议,因为篇幅的原因,本文将第62到89个建议.其他的建议再下几篇文章发布. 7. 结构.位域和枚举 建议62:结 ...

最新文章

  1. JUC AQS ReentrantLock源码分析
  2. 职业操盘手内部教材 z
  3. STM32 基础系列教程 32 – Ethnet+Lwip
  4. sum() over() 函数的使用
  5. Bigtable数据模型和架构
  6. 先验概率与后验概率、贝叶斯区别与联系
  7. angularjs初始化时不显示模板内容, 不显示html, 不显示template
  8. 将博客文章转变为电子书
  9. 在龙芯机器上编译OpenJDK8
  10. ArcGIS 地类净面积计算工具
  11. CSS中使用border属性来绘制三角形
  12. ckplayer只调用html,CKplayer 新手入门超简单使用教程
  13. 家庭组网:Vlan单线复用,故障检测以及五种“软路由”加mesh组网方案
  14. Still,yet和already的用法
  15. 计算机主板显卡型号怎么看,如何查看电脑显卡?4个方法教会你
  16. 以自动化为“遮羞布”,亚马逊掩盖了惊人的工伤记录
  17. iOS应用内跳转到手机淘宝天猫
  18. kali使用笔记本自带无线网卡_不会选无线网卡看过来!再也不花冤枉钱了.........
  19. 2022-2028年中国金融业OCR识别行业市场调查研究及前瞻分析报告
  20. 完善人格的好办法 [转]

热门文章

  1. 【采集层】Kafka 与 Flume 如何选择
  2. 【图】2015年Google搜索引擎排名算法(完整版)
  3. 推荐一款高端大气上档次的在线作图工具
  4. 6.2 IP子网划分
  5. CPU占用率高的九种可能~
  6. 发现一个很好的工具——VNN
  7. NRF52832与W25Q80通信
  8. Kafka不停机,如何无感知迁移ZooKeeper集群?
  9. 一文读懂MySQL事务锁、事务级别
  10. 使用Maven打包你的应用——maven-jar-plugin maven-assembly-plugin maven-shade-plugin