(王垠 yinwang.org 版权所有,未经许可,请勿转载)

在上一篇博文里,我提到了 Yoda 表示法。

Yoda Notation(Yoda 表示法)

它的含义是,在 C/C++ 里面使用这样的表达式顺序:

if ("blue" == theSky) ...

这是为了避免意外的写成:

if (theSky = "blue") ...

“Yoda 表示法”的名字来源于《星球大战》的 Yoda 大师。他说话的单词顺序相当奇特,比如:“Backwards it is, yes!”

一般认为

使用这个表示法是为了“变通”(workaround) C/C++ 的一个设计抉择:使用 = 来表示赋值,而使用 == 来表示比较。这个设计充分的展现了“先辈的罪”(Sins of our Forefathers)这一词汇的精髓。

我认为

使用 = 来表示赋值其实并不是真正的错误所在。真正的错误在于 C/C++ 的赋值语句不应该返回一个值。

也就是说,theSky = "blue" 的所有功能应该只是“赋值”这种“副作用”,副作用不应该具有“值”。即使你牵强附会说它有一个值,它的“值”也应该是 void(随之这个 void 会被类型检查所拒绝,因为它不是 if 所期望的 bool)。所以,一个良好的语言不应该允许你把 theSky = "blue" 放进 if (...) 的“条件”里面。如果你真的要赋值又要判断,它会迫使你把这拆开成两行:

theSky = "blue";
if (theSky) ...

更近一步。if (theSky) 这个写法其实也是一个先辈的罪。theSky 的类型是 string,它不应该可以直接被作为 bool 使用。if (...) 的条件应该必须是一个 bool。 所以这里其实应该写成:

theSky = "blue";
if (theSky != NULL) ...

因为赋值语句永远不可能出现在条件的位置,所以之前的那种错误,即使我们使用 = 作为赋值操作符,也完全不可能出现。这样我们也就完全没必要用 Yoda 表示法了。

相反,如果我们只是把 = 换成像 Pascal 的 := 这样的赋值操作符,而保留其它的“特性”(赋值操作会返回值)的话,我们其实还是会遇到同样的问题:

if (theSky := "blue") ...

这里假设你想打 =,却不小心打成了 :=。机会虽然小,但是仍然有可能。而我推荐的解决方案,会让你故意想犯错误都不可能,编译器会拒绝接受你的程序。

所以你看到了,问题的根源其实不在于赋值操作的名字,而是有更深的原因。

Yoda 表示法错在哪里相关推荐

  1. 【转】几个超炫的专业词汇

    几个超炫的专业词汇 从同事的博客上学会了几个超炫的专业词汇,激动不已.觉得这些词汇可以言简意赅的概括我的好几篇博文,自己的文章水准真是自愧不如.现在来见识一下真正大师级的英语词汇: Yoda Nota ...

  2. c++语言表白超炫图形_几个超炫的专业词汇

    来源:王垠的博客从同事的博客上学会了几个超炫的专业词汇,激动不已.觉得这些词汇可以言简意赅的概括我的好几篇博文,自己的文章水准真是自愧不如.现在来见识一下真正大师级的英语词汇: YodaNotatio ...

  3. [SDOI2016]排列计数 (错排数概念 + 递推公式【附带证明】)

    辛勤二更 题目 题解 错排数概念 错排数递推公式及其证明 代码实现 这种题做的时候: 做完后:正常这就是生活,我们要学会习惯 题目 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n ...

  4. java局部变量说法不正确的是_关于Java的成员变量和局部变量,下面说法错误的是...

    关于 员变 量和 局部不包图的括(作用竣工工程测量. 吊装的技行性特点根据方案论证术可是指设备,变量吊装性的可行研究在技方法术上. 密性和严应做强度试验,面说系统门安.面说排中的中阀装前建筑管道给水供 ...

  5. 计算机包括桌面计算机和便携式计算机,()计算机包括桌面计算机和便携式计算机这两种形式...

    计算机包计算机 量标<环准>)中气质规定境空,括桌化氮括(二氧析方的分法包. 量回应采用分归法,面计用附在引资料象站近气时,不宜相关系数小于,评价二级项目那么对于,于评站位气象情况对于外的 ...

  6. c语言实验答案周信东第三章,桂林电子科技大学C语言程序设计习题答案周信东实验顺序结构与逻辑运算.pdf...

    桂林电子科技大学C语言程序设计习题答案周信东实验顺序结构与逻辑运算.pdf 成 绩 良 评 语 继 续 努 力 . 批 改 时 间 2013-11-16 105155 批 改 老 师 实 验 2 顺 ...

  7. 《程序设计与数据结构》第四周学习总结

    学号 20172326 <程序设计与数据结构>第四周学习总结 教材学习内容总结 列表与栈,队列的关系与区别 有序列表插入时插入方法 无序列表的区别 Comparable方法的重载 用链表, ...

  8. 软件测试设计与开发,软件测试技术·测试设计与开发.ppt

    软件测试技术·测试设计与开发 * 3.4 评审测试用例 复查测试用例时应该考虑的一些问题: 测试或测试组件完全针对的是需求中列出的功能吗? 测试组件是否覆盖了所有需求? 有冗余的测试吗? 每一个测试步 ...

  9. JavaScript中的两个等号(==)和三个等号(===)

    "Determining whether two variables are equivalent is one of the most important operations in pr ...

最新文章

  1. 2022-2028年中国高密度聚乙烯(HDPE)行业市场发展调研及投资前景分析报告
  2. 消息 css 代码,CSS3 通知类消息动画
  3. 皮一皮:大哥!二弟!三弟!
  4. poj 3579 Median 中间值(二分搜索)
  5. python获取当前进程id_从python进程名中获取进程id
  6. mplayer 所支持的音视频编解码
  7. cs231n__4. Backpropagation and Neural Network
  8. Uploadify 3.2 参数属性、事件、方法函数详解以及配置
  9. Trie树 01Trie
  10. MATLAB机器学习决策树网格法优化参数学习笔记
  11. 学习廖雪峰的Git教程
  12. 计算机网络(HTTP协议 与 HTTPS)
  13. 软件工程——NS图,PAD图
  14. 开启邮箱的SMTP服务获取授权码(QQ邮箱、163邮箱)
  15. 我要写整个中文互联网界最牛逼的JVM系列教程 | 「JVM与Java体系架构」章节:JVM的发展历程
  16. windows下安装ppocr服务 paddlehub方式
  17. Oracle ACE,一段不可思议的旅程
  18. Nodejs内存溢出原因
  19. 软件系统的服务器环境,服务器软件环境操作系统
  20. 博客系统视频_视频博客| 视频博客

热门文章

  1. 势能线段树/吉司机线段树-我没有脑子
  2. 在LNMP或Nginx上配置NameCheap免费SSL证书
  3. OpenStack之Keystone模块
  4. linux挂载和卸载
  5. QQ超市模拟排配2D版1.13 (XNA4.0) (修正双格货架移动的一个bug和3-5地图)
  6. 领英全球副总裁:如何做到 5 亿用户增长的 ?
  7. 我为什么看好中国的共享单车
  8. 优酷土豆CEO:打造爆款产品的3个关键步骤
  9. 前苹果副总裁:20-40-60法则
  10. Jmeter性能测试-GC相关