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

前世今生

---------2012年9月28日 13时32分 新增-------

最近看本文评论,争议很多,我先说说这篇文章的前世今生吧。

我原文标题是『代码之谜 - 开篇/前言/序』,副标题是『其实,你不懂代码』,本来打算用“其实,代码中的运算符不等价于数学符号”。原文我写于2010年底,当时写在 evernote 中,用了”群“、”域“、”集合“、”关系“的概念解释了计算机中用二进制表示的离散的数和现实中连续的数之间的关系和区别。

前几天群里有人问道,遂打算写一个系列,用比较「贫」的语言把他们讲述出来。

原文首发在我的博客: http://justjavac.com/codepuzzle/2012/09/25/codepuzzle-introduction.html, 因为我也不能保证我的博客空间总是稳定的,所以,将这篇文章发布到了iteye,还可以顺便看看热心网友的评论。

----------正文分割线-------------

答应了群里的兄弟们要更新博客,结果回家又是洗衣服做饭的,转眼已经10点多了。

趁洗衣机正在转的功夫,打开 Evernote 找到了以前的几段 javascript 代码,本着人性本贱(咳,咳,该死的输入法,更正「人性本荐」)的精神, 给大家共享一下,不定期更新,算是我「代码之谜」系列的开篇吧。

我喜欢读一些让人震惊的书,比如『哥德尔、艾舍尔、巴赫书:集异璧之大成』,比如『从一到无穷大』,读完后张大嘴巴,「哇噻,太不可思议了,太令我震惊了」。 本系列博客的目的之一就是让每个阅读过的人在思维方式上有所改变,变得更理性,更加会思考,会学习。

本系列说来话长,从10年开始构思,当时写在 evernote 里面,名字叫『理性,像数学家一样思考』,废话少说,言归正传,贴代码吧

第一段代码:

 

function foo1(a){
    return a + '01';
}

foo1(01) 

 

第二段代码:

 

function foo2(a){
    return a + '010';
}

foo2(010); 

 

第三段代码: (注: 这不是 javascript 的问题,而且所有语言的问题,归根结底是 IEEE 标准中二进制浮点运算的问题,关于浮点数的详细问题请阅读 代码之谜 - 浮点数,「为什么没有链接呢,呵呵,因为我还没有写,正在整理中」。)

console.log(0.2 + 0.4);

第四段代码就相对来说简单多了: 参考我一些发布的这篇为什么 ++[[]][+[]]+[+[]] = 10?。

[4,[3,2]][1][0];     // 3

 

-----------------------分割线-----------------------------

2012年9月25日 22时25分 更新

还是忍不住,睡前想唠叨几句。

也许很多人第一次接触编程时,对 i = i + 1 都感到百撕不得骑姐(咳,我就说了嘛,必须得换一个输入法了,更正「百思不得其解」)。

“i加上1怎么可能和i相等呢?”

后来慢慢知道了,不,确切的说,是慢慢地接受了,接受了=是赋值(前提是你学的不是pascal,我的入门语言就是它),因为你可能根本没有思考,只是被动接受。

再后来,我们学了 if, 开始写分支代码:

if (a >3) { 
    // do something        
}

if (a < 5) {
    // do  something
}

 

但是当我们写出 if (3 < a < 5) 时,居然报错了,又是百撕不… 后来被教导了,这么写是错的,应该if (a>3 && a<5)。 于是我们又开始接受了,认为这么写是理所当然的,而且以后的代码都是这么写的。

 

直到有一天,你看了 python 的入门手册,尼玛,居然逆天的出现了 ‘if 3 < a < 5:’,当时绝对又震惊了,“怎么可以这么写?”。 难道你忘了,N年前你就是这么写的,而且当时你不也认为 3 < a < 5 是理所当然的吗(任何一个高中生都会同意这种写法), 为什么你现在又开始觉得 3 < a < 5 是种逆天写法呢,因为你在这几年的编程生涯中,已经被动接受了太多太多的东西,而且使你根本就不曾思考过, 这也是我写「代码之谜」系列的初衷。

当你被告知了,在编程中=是赋值的意思(其实他们没有告诉你,只是大部分语言这样,还有很多语言不是这样,比如pascal中:=是赋值,比如basic/VB中=即是赋值也是判断), 但是=如果不是相等的话,那肯定有表示相等的,对,就是==,或者===。

不管是==还是=,「相等」到底是什么意思呢?=或者==或者===,即使以后会出现====,到底和数学的「相等」有多少出入呢?

知道我们遇到了传说中的NaN(很多人认为NaN既然表示Not A Number,那么他就是语言定义的一个东东,根本不存在,这是错误的,NaN是在IEEE浮点数规范中明确定义的,包括本系列后面 后提到的+0和-0问题),它不等于任何值,而且,它居然不等于它自己。

一个数居然不等于它自己,其实确切的说,是 NaN == NaN 居然返回 false, 甚至 NaN === NaN 也返回 false。是 NaN 的问题,还是==或者===的问题,抑或这根本就是相等这个概念的问题。

在集合论中,相等的三要素,不管是==还是===,都无法满足,所以说,===根本就不是相等(如果你读过数学的「群伦」就更明白了)。

相等(等价)的三要素

  1. 自反省: A等于A
  2. 对称性: 如果A等于B,那么B等于A
  3. 传递性: 如果A等于B,而且B等于C,那么A等于C

当我们看到这几条定理时,我们从来没有怀疑过。 脱离了数学,我们进入了编程领域,当我们遇到了NaN, 我们知道了,在IEEE的数字表示规范里面,「自反省」是不被满足的,那么传递性和对称性呢? 如果你找到了反例,可以留言。

也许你说,相等/等于/全等/等价这些比较特殊,其它的应该都会满足吧。 我只能告诉你(说通俗一点),以前的所有定理、公理都只适用于一个领域,当它进入另一个领域我们就不能把它当作理所当然的,也许它没有问题,比如 1+2=3,但也许这只是一个巧合, 上面我就提到了 0.2+0.4 就不等于 0.6。

计算机和现实最大的不同(也是问题的根源)就是,世界是连续的,而计算机是非连续的,是离散的。 以前我们学校图书馆有很多「计算机数学」或者「离散数学」之类的书,我现在都不明白,里面写的那些数学,是设计计算机的工程师读呢,还是使用计算机的程序员读呢?里面的内容简直就是大杂烩嘛。 什么是离散数学呢?我的理解,不连续的数学都是离散数学。比如量子论里面用到的数学,就是离散数学。

其它算数定律或者定义有不满足的吗?

再举一例,上小学刚学乘法运算的时候老师就告诉我们,3x4就是4个3相加,下面这个例子再次颠覆你的想法。

console.log(0.1 * 10);
console.log(0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1);

 

写完睡觉,如果大家有什么更好的例子,欢迎补充。

天邑TY1613 TTL刷机指南:海思Hi3798MV300完整流程 串口通信是嵌入式设备调试与系统恢复的重要基础,其中TTL电平通过简单的收发引脚实现数据交互,在机顶盒、路由器等设备维护中应用广泛。串口原理并不复杂,关键在于电气匹配与连接逻辑——USB转TTL模块将电脑USB信号转换为设备可识别的3.3V电平,配合终端工具即可进入设备的底层引导环境。这一技术在运营商定制机顶盒上尤其实用,因为官方固件常受签名校验和系统锁定限制,常规U盘刷机难以生效。通过TTL串口与uboot交互,用户能够绕过系统限制,手动完成固件备份、分区擦除和镜像烧写,从而解决设备卡顿、预装软件过多等问题 阅读详情

相关推荐

INMP441麦克风避坑指南:为什么你的I2S录音总有杂音?(附示波器调试技巧)

本文针对INMP441麦克风与ESP32等MCU通过I2S接口连接时常见的录音杂音问题,提供了一套系统的硬件调试指南。文章深入剖析了电源纹波、信号完整性、接地环路及时钟抖动四大噪声根源,并详细讲解了如何使用示波器进行逐层排查,给出了增加LC滤波、串联阻尼电阻、优化布局布线等切实可行的解决方案,帮助开发者从根本上提升音频质量。

k0l1m2n3o的博客 1021

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

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

iteye_6378的博客 312

RexUniNLU零样本通用自然语言理解:nlp_deberta_rex-uninlu_chinese-base模型实战解析

本文深入解析了RexUniNLU零样本通用自然语言理解模型(nlp_deberta_rex-uninlu_chinese-base)的实战应用。通过详细的环境配置、模型加载及实战案例,展示了该模型在零样本场景下的强大能力,如实体识别和复杂关系抽取,显著提升NLP任务效率。

weixin_29088655的博客 250

【免费下载】 贵州电信天邑TY1613-s905l3-b-rtl8822cs当贝固件刷机教程:解锁无限可能

贵州电信天邑TY1613-s905l3-b-rtl8822cs当贝固件刷机教程:解锁无限可能 【下载地址】贵州电信天邑TY1613-s905l3-b-rtl8822cs当贝固件刷机教程 本仓库提供了一份详细的刷机教程,适用于贵州电信天邑TY1613型号的机顶盒,具体型号为s905l3-b,并配备了rtl8822cs无线网...

gitblog_09778的博客 3792

深度解读华为Limera:从舱内激光视觉融合看前融合技术的发展与演进

华为Limera激光雷达摄像头融合技术推动自动驾驶感知升级 华为推出的Limera创新性地将激光雷达与摄像头深度集成,采用共光路设计实现数据天然对齐,在小型障碍物识别等关键场景展现卓越性能。该产品代表了传感器前融合技术从分立走向共生的演进趋势,通过硬件级集成解决了多源异构数据融合难题。随着索尼堆叠式传感器等技术的出现,未来智能汽车感知系统将向高度集成的"超级传感器"方向发展,实现更精准的环境感知。Limera的发布标志着前融合技术从"可用"迈向"极致&quo

致力于lidar应用开发 395

【OpenClaw从入门到精通】第60篇:多智能体协同实战——用“龙虾”搭建你的数字员工团队(2026企业版)

2026年AI Agent企业落地的核心趋势,正从“单Agent单兵作战”转向“多智能体协同组网”。本文以全球开发者先锋大会“百虾大战”真实案例为蓝本,深度拆解OpenClaw多智能体协同的技术内核——三层解耦架构(模型层-技能层-网关层),系统搭建包含项目经理、架构师、执行者、质量把关者的4大核心Agent团队。通过三种主流协作架构对比、全链路配置代码实操、故障自愈实战演练,结合电商新品上架虚拟场景全流程演示,解决企业多Agent部署中的权限隔离、任务协同、运维自治三大核心痛点。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 767

烽火HG680-KA_HI3798MV310处理器_TTL海兔线刷烧录固件包_可救砖

刷机既有乐趣也有风险,请慎重选择,一切源于刷机造成的后果自负,本人概不负责!固件路径:A《当贝桌面纯净完美版--固件大全》(固件种类更多)>5《烽火(HG)盒子固件合集》 >《HG680-KA》海思芯片。6、支持开机自启动、开机密码锁、儿童应用锁、应用隐藏、开机自动进入HDMI等各种花式功能;海兔烧录工具,选择MV310,网盘资料文件里面有海兔烧录工具。

点我主页,可查看所有固件文章! 9027

YOLOv12改进前必看 - YAML模型配置文件详细解读(再也不用担心通道数不匹配) 附网络结构图

YOLOv12的模型配置文件在中,里面包含yolov12的以及的不同大小的模型,本文将详细介绍一下YOLOv12模型文件中各参数的含义。

Limiiiing的博客 3275

贵州电信天邑TY1613_s905l3-b_rtl8822cs高安版线刷机教程

3.机器插入电源线,电源按钮别开,镊子短接主板背面4R12对应的电阻,然后数据线插入到sd卡槽旁边的usb口 即可联机;如需固件包可到下面链接自行下载哈;2.下载刷机工具并打开,导入固件包里的img格式的固件包;优化待机偶发性死机问题,去除开机广告,提升开机速度;网站及作者不会对任何因刷机造成的一切问题负责;融合鸿蒙系统架构,提高CPU的运算能力;本固件仅适用于晶晨处理器高安版盒子刷机;1.下载固件包并进行解压;刷机有风险,动手需谨慎,

szjytx666的博客 15万+

【四足机器人项目实战】四足机器人腿部机械结构设计

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录系列文章目录前言 前言 认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长! 本文先对四足机器人–腿部机械结构设计做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章 提示:以下是本篇文章正文内容 为了减轻腿部惯量,使用有限元分析着重进行轻量化设计,小腿采用工字梁方案,大腿采用内部镂方案,并使用1.5 mm的AL 6061硬质材料,轻量化的腿部设了腿部运动时摆动

qq_35635374的博客 7538

C#上位机实战:工业产线数据采集与监控系统开发(附源码思路)

模块化设计:四层架构清晰,各模块独立可替换,便于后期维护与扩展;稳定性强:支持断线重连、异常重试、并发采集,满足工业7×24小时运行需求;实用性高:覆盖产线监控核心功能,可视化组件适配工业场景,操作简单;源码可复用:通信类、采集服务、报警管理器等可直接复制到其他上位机项目。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1651

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

答应了群里的兄弟们要更新博客,结果回家又是洗衣服做饭的,转眼已经10点多了。 趁洗衣机正在转的功夫,打开 Evernote 找到了以前的几段 javascript 代码,本着人性本贱(咳,咳,该死的输入法,更正「人性本荐」)的精神, 给大家共享一下,不定期更新,算是我「代码之谜」系列的开篇吧。 我喜欢读一些让人震惊的书,比如《哥德尔、艾舍尔、巴赫书:集异璧之大成》,比如『从一到无穷大』,读

我的Github 2158

Windows 11 安装 JDK 21:下载、安装、配置环境变量、验证

本文详细介绍了在 Windows 11 系统中安装 JDK 21 的完整流程,包括从 Oracle 官网下载压缩包、解压至自定义目录、配置 JAVA_HOME 与 Path 环境变量,并验证安装是否成功。文章推荐使用 ZIP 压缩包而非安装程序,以实现绿色便携、多版本共存等优势,并通过一个包含 Java 21 新特性的示例程序进行功能验证,适合开发者快速上手。

寒水馨 · 轻量级技术文档 · hanshuixin.org 2512

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

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

wfx的专栏 353

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

基于ADCS8162的电池化成测试多通道同步采样方案

多通道同步采样ADC是电池化成测试中保证数据一致性的核心器件,其原理是通过独立采样保持电路在同一时刻冻结多路输入信号,消除轮询式ADC的通道间时间偏差。在锂电池化成、分容及脉冲内阻测试等场景中,同步采样直接影响库仑效率计算精度和电芯一致性分析结果。ADCS8162作为16位八通道同步采样ADC,集成输入箝位保护与SPI接口,配合合理的模拟前端与PCB布局,可有效提升化成测试设备的采样有效位数与现场可靠性,为多通道电池测试提供兼顾精度与成本的工程化选型参考。

weixin_34389926的博客 178

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

代码之谜(零)- 开篇/前言/序 其实,你不懂代码

最近看了一个系列的文章,感觉很受启发,在此转载:

zzhou910的专栏 670

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

代码之谜 - 其实,你不懂代码

答应了群里的兄弟们要更新博客,结果回家又是洗衣服做饭的,转眼已经10点多了。 趁洗衣机正在转的功夫,打开 Evernote 找到了以前的几段 javascript 代码,本着人性本贱(咳,咳,该死的输入法,更正「人性本荐」)的精神, 给大家共享一下,不定期更新,算是我「代码之谜」系列的开篇吧。 我喜欢读一些让人震惊的书,比如『GEB』,比如『从一到无穷大』,读完后张大嘴巴,「哇噻,太不

黄沙百战穿金甲,不破楼兰终不还。 829

代码之谜-其实,你不懂代码

第一段代码: function foo1(a){ return a + '01'; } foo1(01); 你想它输出 0101,很遗憾,不是,当实参01赋值给形参a时,a的值是1,所以,最终输出结果是 101 第二段代码: function foo2(a){ return a + '010'; } foo2(010); 有了第一段代码的解释,你应该会认为他输出 10

ld513508088的专栏 798

程序员的十大未解之谜

比如:大家用的都是 Java 8,但你的代码总报错,结果发现你装的 JDK 是个魔改版,路径里还夹着个“偷偷摸摸的代理插件”。再比如,同样一个脚本,别人用 MySQL 跑飞起,你一跑直接炸,原因是你的 SQL Client 是上古版本……比如:你改了个配置文件里的参数,把 timeout=100ms 改成了 timeout=10ms,心想“加快点响应速度嘛,稳的”。来,系好安全带,出发!写多线程代码的程序员,都经历过这样的时刻:代码逻辑明明很对,单线程也跑得完美,但一到多线程,Bug 开始群魔乱舞。

m0_61562916的博客 702

[蓝桥杯]路径之谜

从左上角走到右下角 四联通方向 每走到一个格子 向正北和正西射一支箭 每个点只能走一次。idx表示上一次是第几步 (从0开始) 用于path数组记录 填充和撤销。因为x,y代表上一次走的点 既然上一次已经走到右下角了 就不要继续往下走了。x,y 表示上一个点的坐标 这一次dfs要通过(x,y)的四个方向扩展。另外 要判断每个行列的箭数目是否匹配 如果匹配才要输出path。这段代码注意要在x==-1&&y==n-1 时return。题目给出最后竖向和横向上的每个靶子上的箭的总数。

weixin_45413272的博客 2255

【蓝桥杯】43686-《路径之谜》

小明冒充 X 星球的骑士,进入了一个奇怪的城堡。城堡里边什么都没有,只有方形石头铺成的地面。假设城堡地面是 n×n 个方格。如下图所示。图1按习俗,骑士要从西北角走到东南角。可以横向或纵向移动,但不能斜着走,也不能跳跃。每走到一个新方格,就要向正北方和正西方各射一箭。(城堡的西墙和北墙内各有 n 个靶子)同一个方格只允许经过一次。但不必走完所有的方格。如果只给出靶子上箭的数目,你能推断出骑士的行走路线吗?有时是可以的,比如上图中的例子。

清弦墨客的博客 2064

代码之谜系列

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

1232
上一篇: 你为什么薪水那么低
下一篇: 为什么中国的程序员总被称为码农?
SleepInDelphi
博客等级 码龄19年 32粉丝 388原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值