代码之谜(三)- 运算符

本章是我『代码之谜』系列的第四篇,如果链接打不开可以在咱iteye找到以前的文章,http://justjavac.iteye.com/blog/1685559。

 

从最简单的运算符加号(+)说起,加号(+)是个二元运算符——也就是说,加号只把两个数联接起来,从来不把第三个或者更多的联接起来。

因此,“1加2加3” 在计算机中被表述为:

(1 + 2) + 3      // a

或者

1 + (2 + 3)      // b

虽然我们通常写做 1 + 2 + 3,但是并不意味这它和我们数学中的 1+2+3 是等价的。

那么数学中的 1+2+3 到底表示的是 a 呢,还是 b 呢?

如果计算机的求值是左结合的,那么此表达式等价于第一种a; 如果是右结合的,那么此表达式等价于第二种b。

1 + 2 + 3 简单的理解就是 “把1、2、3加在一起”, 确实,在我们接触到的数学里面,就是把三个数加起来。 但是在编程语言中,却不仅仅这样。

就像前面说的那样,+号无法操作三个或者更多的数,参与加法运算的只能是两个数。

顺便说一句,正号、负号是一元运算符,虽然它们和二元运算符加、减用相同的符号, 但是他们却是不同的,所以不要想当然的认为 +4 就等价于 0+4,其实它们不是等价的,

+4 是一个整数,但是 0+4 是一个加法表达式,这个表达式的求值结果正好是 +4。

在 java 中,我们可以写 short a = +4,但是当我们写 short a = 0 + 4 时则产生一个警告。

还有一个其它例子,同样是关于 short 的,

short b = 1;
short b = b + 4;   // 警告
short b += 4;      // 无警告

那么 1 + 2 + 3 是如何运算的呢? 在冯诺依曼体系架构的编程语言中, 这里有一个副作用——我习惯称那些“计算机的运算过程与程序员的大脑思考过程不一样时,则称为副作用”(虽然书本里面没有这么写过,但我一向这么认为), 本来你以为会是这样,结果计算机偏偏就不是这样做的,我称他为副作用。

如果看过前面的『语句与表达式』,这可以这么理解:

1 + 2 是一个表达式,它的返回值是 3。 这个表达式的返回值再参加到另一个表达式中 3 + 3,最后得出结果6。

我们用语句(Statement)来改写这段代码:

// 计算 1 + 2 + 3
var a = 1 + 2;
var b = b + 3;

如果我们用 lisp 语言对这个表达式求值,则没有副作用。

(+ (+ 1 2) 3)

如果你还没有懂,或者这个例子太有特殊性,那么我们换一个

5 > 4 > 3

在数学中,这个算式的值为 true。当我们用C语言来写这段代码,它返回的确实 false。

原因和上面的一样,大于号(>)是二元运算,它无法直接比较三个数,5 > 4 返回的结果是 true, 当用 true 和 3 比较时,true 被转换称 1,也就是 1 > 3,最终的结果自然就是 false 了。

总之,回归到了『语句与表达式』篇的那个观点:在编程语言中 每个表达式都有一个值。

编程语言中的运算符和数学中的运算器虽然一样,但是它们却并不等同。 当你写程序时,要写给人看; 当你调试程序时,要学会用计算机的方式思考代码的含义。

我习惯于把运算符理解为函数,比如 2 + 5 其实就是 add(2, 5) 或者 2.add(5)。 难道我会偷偷的告诉你 “其实很多语言都是这么做的”。

高通camera驱动 camx read xml 和 probe 流程 和 sensor I2C读写的波形图 (三) Camx 刚接触的时候对于这个xml 一脸懵逼,实际上和mm-camera差不多就是以xml node节点的方式标准化了driver相关的code,exposure 和 gain的逻辑实现还是在同级目录的cpp中,并且将 xml 的解析工作放在了 out/target/<product>/gen/STATIC_LIBERARIES/libcamxgenerated_intermediates/generated/ 中主要是包含了: g_chromatix : tuning 相关xml的解析co 阅读详情

相关推荐

SLUB DEBUG 检测slab 内存泄漏

文章介绍如何定位linux 内核中slab 内存泄漏。

一叶知秋的博客 1490

代码之谜(零) - 其实,你不懂代码

2012年9月28日 13时32分 新增 最近看本文评论,争议很多,我先说说这篇文章的前世今生吧。 我原文标题是『代码之谜 - 开篇/前言/序』,副标题是『其实,你不懂代码』,本来打算用“其实,代码中的运算符不等价于数学符号”。原文我写于2010年底,当时写在 evernote 中,用了”群“、”域“、”集合“、”关系“的概念解释了计算机中用二进制表示的离散的数和现实中连续的数之间...

iteye_6378的博客 312

vue高德地图POI关键字搜索定位

最近在项目中遇到了关于地图的问题,首先为了满足需求从而使用的是JSAPI为2.0版本的。需求是根据关键字搜索定位到该位置。值得注意的是在使用 AMap.Event.addListener时 Event一定要大写的E,不然页面会报错。在地图上定义一个输入框,根据输入的位置进行提示,然后点击后跳转到对应的位置并打点标记。JSAPI主要使用这两个。

YL 2135

[乐意黎转载]代码之谜--justjavac(迷渡)

代码之谜 http://justjavac.com/codepuzzle.html 代码之谜(零)- 开篇/前言/序  http://justjavac.com/codepuzzle/2012/09/25/codepuzzle-introduction.html 代码之谜(一)- 有限与无限 从整数的绝对值说起 http://justj

打杂人-aerchi 794

Zotero PDF Translate插件实战:DeepL API免费申请与高效翻译配置指南

本文提供Zotero PDF Translate插件配置DeepL API的完整实战指南。详细介绍了如何免费申请DeepL API密钥,解决国内访问问题,并在插件中完成精细配置,实现文献阅读时的无缝划词翻译,大幅提升科研人员和学生的英文文献阅读效率。

rum55的博客 455

目标检测 RT-DETR(2023)详细解读

在使用了这个技巧后,显然训练过程中,类别的标签不再是此前的0和1离散值,而是0~1的连续值。关于 Query Selection(查询向量选择),大家应该并不陌生,这个方法可谓在DETR领域大杀四方,如DAB-DETR对查询向量进行重构理解,将其解释为Anchor,DN-DETR通过查询降噪来应对匈牙利匹配的二义性所导致的训练时间长的问题,DINO提出从Encoder中选择Top-k特征进行学习等一系列方法,这都无疑向我们证明,查询向量很重要,选择好的Query能够让我们事半功倍。在RT-DETR中,

qq_51352130的博客 5865

代码之谜(三) - 运算符

从最简单的运算符加号(+)说起,加号(+)是个二元运算符——也就是说,加号只把两个数联接起来,从来不把第三个或者更多的联接起来。 因此,“1加2加3” 在计算机中被表述为: (1 + 2) + 3 // a 或者 1 + (2 + 3) // b 虽然我们通常写做1 + 2 + 3,但是并不意味这它和我们数学中的 1+2+3 是等价的。 那么数学...

iteye_6378的博客 271

AIGC算法工程师面试八股文深度解析与进阶指南:揭秘Diffusion Models核心原理与实战技巧

总结来说,Cosine Noise Scheduler 的核心优势在于它能够更巧妙地平衡信号和噪声的比例,在扩散过程的早期阶段更长时间地保留原始图像的细节信息,从而为去噪模型提供一个更友好的学习环境,最终带来更优异的生成质量。🚀

FJN110的博客 344

代码之谜(四)- 浮点数(从惊讶到思考)

在『代码之谜』系列的前几篇文章中,很多次出现了浮点数。 浮点数在很多编程语言中被称为简单数据类型,其实,浮点数比起那些复杂数据类型(比如字符串)来说, 一点都不简单。 单单是说明 IEEE浮点数 就可以写一本书了,我将用几篇博文来简单的说说我所理解的浮点数,算是抛砖引玉吧。 一次面试 记得多年前我招聘 Java 程序员时的一次关于浮点数、二分法、编码的面试, 多年以后,他已经...

iteye_6378的博客 314

ABAP 7.40 新语法介绍系列之六:使用 FILTER 关键字对 ABAP 内表进行过滤

笔者之前写过的关于 ABAP 740 新语法的文章:本文介绍另一个新的关键字:FILTER.FILTER 是 ABAP 740 中引入的一个关键字,用于简化数据操作,它能够将内部表(Internal Table)中的数据按特定的条件进行过滤,并生成一个新的内部表。FILTER 的引入旨在使代码更加现代化和高效,尤其是在面对大量数据需要过滤的情况下。传统上,开发人员可能需要使用 LOOP AT 结合条件判断来实现,但使用 FILTER 关键字后,代码显得更加简洁且易于维护。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1167

Coze工作流的代码无法安装第三方模块(依赖)怎么办?(如何解决Coze工作流代码缺少模块(依赖)的问题)

Coze工作流的代码无法安装第三方模块(依赖)怎么办?(如何解决Coze工作流代码缺少模块(依赖)的问题)

XiaoqiangClub的博客 4364

Matlab ||和&&运算符的操作数必须能够转换为逻辑标量值

Error:Matlab ||和&&运算符的操作数必须能够转换为逻辑标量值解决:||和&&为值运算, |与&为向量运算,改为|与&

未到初级图像处理工程师 7万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【转】代码之谜(三) - 运算符

从最简单的运算符加号(+)说起,加号(+)是个二元运算符——也就是说,加号只把两个数联接起来,从来不把第三个或者更多的联接起来。 因此,“1加2加3” 在计算机中被表述为: (1 + 2) + 3 // a 或者 1 + (2 + 3) // b 虽然我们通常写做 1 + 2 + 3,但是并不意味这它和我们数学中的 1+2+3 是等价的。 那么数

wfx的专栏 323

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

C++20 新特性: 三向比较运算符

C++20 引入了一种新的比较运算符,称为“三向比较运算符”或“太空船运算符”,其符号为 ``。这个运算符提供了一种简化方式来同时比较两个值的相等性、小于和大于状态。这一特性主要旨在简化代码并改善性能,通过一次操作就能得到完整的比较结果。

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 2075

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

代码之谜系列

代码之谜(零)- 开篇/前言/序 其实,你不懂代码 2012年9月28日 13时32分 新增 最近看本文评论,争议很多,我先说说这篇文章的前世今生吧。 我原文标题是『代码之谜 - 开篇/前言/序』,副标题是『其实,你不懂代码』,本来打算用“其实,代码中的运算符不等价于数学符号”。原文我写于2010年底,当时写在 evernote 中,用了”群“、”域“、”集合“、”关系“的概念解释了计算机中

1232

聊聊C++20的三向比较运算符 `<=>`

从这一个小小的三相比较运算符的引入,我们可以看到C++的复杂之处与细心之处,我们也能一窥现代C++的发展趋势,具体的复杂和细心在哪里体现?本文为您揭晓。

hebhljdx的博客 1653

Java基础语法(三)——运算符

文章目录Java基础语法(三)——运算符一、算术运算符1.基本四则运算符(1)练习(2)注意事项2.复合运算符3.自增自减操作符二、关系运算符三、逻辑操作符1.逻辑与&&2.逻辑或 ||3.逻辑非!4.短路求值四、位运算符1.按位与&2.按位或 |3.按位异或 ^4.按位取反 ~五、移位操作符1.左移操作符<< Java基础语法(三)——运算符 本次内容介绍大纲 一、算术运算符 1.基本四则运算符 符号 作用 说明 + 加 两数相加 - 减 两数相减

rain67的博客 4821

C++和标准库速成(四)——逻辑比较运算符、三向比较运算符、函数和属性

逻辑比较运算符、三向比较运算符、函数和属性

qq_51180928的博客 903

Java从入门到“放弃”(精通)之旅——运算符③

运算符作为Java语言的基础构件,其正确使用直接影响代码的质量和性能。希望本文能帮助开发者在实际工程中更加游刃有余地运用这些基础但强大的工具。

此人很懒,什么都留下了...快进来看看吧 2412

nullptr、三向比较运算符、线程局部存储

nullptr是 C++11 引入的一种关键字,用来表示空指针。它的引入主要是为了取代传统的NULL和0,从而避免由于类型不匹配带来的潜在问题。使用nullptr有助于提高代码的可读性和类型安全性。

weixin_43614932的博客 620
上一篇: 代码之谜(二)- 语句与表达式
下一篇: 精通one,学习another,关注next
SleepInDelphi
博客等级 码龄19年 32粉丝 388原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值