当前位置: 首页 > news >正文

新手看过来----讨厌的运算符

       在计算机的世界里,虽然有很多数学的影子,但在计算公式转换为计算机语言时,很多表达方式并 不一致,这导致新手们初期不习惯,很容易用错,需要一个记忆的过程。就像学习英文,主谓宾定状补的先后顺序于中文是不一致的。在翻译句子时很容易产生中式英语。

      本文就问答中经常出现的计算机语言和数学公式写法不一致的,与运算符相关的问题进行梳理,希望新手们能够快速度过适应期。(当然,不同计算机语言在表达时也有差异,本文仅以C/C++为例,也暂不考虑C++新标准的特性)。

1、讨厌的等号

       判断值相等,用==符号,而变量赋值使用=符号。新程序员们还不太习惯==这个东西,很容易写成=符号。从而是判断语句变成了赋值语句。而编译器也不会报错,但结果却发生了很大的变化。

比如  if(n=0) {do something;}

      原意是想判断n等于0的话,执行某些操作,但写成n=0后,先是将n值改成了0,然后由于if(0)不成立,代码根本就不执行if的代码块。因此完全达不到想要的效果,所以一定要注意,回头找不好发现。

      对于==误写成=,如果是判断变量与值是否相等,可以有个好方法,就是将值写在左侧,变量写在右侧,如此一旦误写==为=,编译器会报错提醒。

      比如 if(a==0),写成 if(0==a),对于==表达式,两种写法都成立,但对于=操作符,只有a=0成立,0=a是错误的。希望对大家有帮助。

2、讨厌的取值范围判断

       数学中表示一个值的取值范围,一般写成如: 1<=x<=10这样子。但计算机语言不是这样写的, 必须是x>=1 && x<=10这样的逻辑与表达式。但同样1<=x<=10编译器并不会报错,也是可以执行的代码。先比较1<=x是否成立,结果是个布尔量,成立则为1,否则为0。然后再判断布尔值是否<=10,这是永远成立的,所以只要右侧的值大于等于1,那么无论x是多少,整个表达式结果都是1。同样,如果右侧值小于0,则整个表达式结果是0。这自然不是程序员需要的结果,因此必须要注意。

3、讨厌的乘号

       在数学中,两个数相乘时,乘号是可以省略的,但计算机语言中不可以,一旦乘号省略,会被识别为变量名。比如 2*a,写成2a就会报错,因为2a不符合变量命名规范。如果a*2,写成a2,则会报未定义的变量。一旦不幸前面敲好定义了变量a2,那么编译器就不会报错,但程序结果就完全无法预测了。所以要注意,乘号不能省略。

      另外,*号即是乘号,也是指针符号,要注意区分。

4、讨厌的除号

      除号容易出两个问题,一是除数为0,二是整除。

      除数为0时,如果没有提前排除,也没有异常捕捉,那么程序会崩溃。所以一定要先检查除数是否为0的情况,进行特殊处理。

      当两个整数相除时,其结果是整除的结果,比如6/4=1,而不是1.5,因此特别要注意,出错率很高,写错了不容易发现。有时候交换表达式中的顺序结果就不一样。

    比如6/4*0.5 = 0.5,但6*0.5/4就是0.75。

5、讨厌的逻辑与和逻辑或

      逻辑与和逻辑或有熔断的特性,会导致某部分表达式实际不会执行。

      比如:

      int a=1,b=3,c=5;

      if(a>b && b<++c) {do something;}

      对于逻辑与表达式,结果为真的条件是两侧表达式结果都为真。如果左侧表达式为假,那么整个表达式结果必然为假,因此右侧表达式将不再执行。

      上述if语句中,由于a>b为假,所以右侧的b<++c并不会执行,c值始终是5,没有改变。

      if(a<b || b>++c) {do something;}

      对于逻辑或表达式,结果为真的条件是有一侧表达式结果为真。如果左侧表达式为真,那么整个表达式结果必然为真,因此右侧表达式将不再执行。

      上述if语句中,由于a<b为真,所以右侧的b<++c并不会执行,c值始终是5,没有改变。

      这就是逻辑与和逻辑或的熔断特性。此特性在未来模块化编码中也会经常使用。特别是在指针的应用上。比如经常会有如下代码:

      Node *p = head; 

      if(p != NULL && p->data != x) { p = p->next;}

      如果没有熔断特性,当p为空时,右侧表达式就会导致程序崩溃。但由于左侧表达式为假,因此右侧表达式就不会执行,程序正常运行。

相关文章:

  • Matlab中importdata函数的使用
  • 4)自适应滤波(一)
  • Web前端期末大作业-重庆旅游景区网页设计(HTML+CSS+JS)
  • MySQL:复合查询和内外连接
  • 高亮蓝紫光油溶性ZnSe/ZnS量子点,PL波长390nm-440nm
  • SpringMVC概述及入门案例
  • 这篇文章告诉你三个好用的配音软件
  • 看漫画学Python 原来真的有用
  • Spring Cloud Gateway获取认证用户信息
  • 软件项目的自动化测试
  • 华为云的云计算比阿里云的云计算认证好吗?
  • Linux教程:RocketMq介绍以及集群服务搭建(双主双从同步双写)
  • RK3399平台开发系列讲解(设备树篇)设备树资源的处理
  • 项目实战第二十二讲:使用职责链模式实现商品审核
  • 笔试强训(十三)
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • 【RocksDB】TransactionDB源码分析
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • Android优雅地处理按钮重复点击
  • Apache Pulsar 2.1 重磅发布
  • Django 博客开发教程 8 - 博客文章详情页
  • docker容器内的网络抓包
  • ECS应用管理最佳实践
  • Effective Java 笔记(一)
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • Javascript弹出层-初探
  • JS学习笔记——闭包
  • Making An Indicator With Pure CSS
  • React-生命周期杂记
  • Sublime text 3 3103 注册码
  • Swift 中的尾递归和蹦床
  • vue-cli在webpack的配置文件探究
  • Vue--数据传输
  • 飞驰在Mesos的涡轮引擎上
  • 诡异!React stopPropagation失灵
  • 技术发展面试
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 什么软件可以剪辑音乐?
  • 微服务框架lagom
  • 微信开放平台全网发布【失败】的几点排查方法
  • 优秀架构师必须掌握的架构思维
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • #### go map 底层结构 ####
  • #pragma 指令
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • #前后端分离# 头条发布系统
  • (02)Hive SQL编译成MapReduce任务的过程
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (转) Face-Resources
  • (转)3D模板阴影原理