- Published on
哨兵牙膏:日常生活中的一个有用的编程技巧
哨兵牙膏:日常生活中的一个有用的编程技巧
作者:Adam Dunkels,PhD
发表于:2022年11月18日
阅读时间:约4分钟
原文链接: https://dunkels.com/adam/sentinel-toothpaste/
这是我发现非常有用的一个编程技巧:哨兵值。我几乎每天都用它——例如在管理牙膏时。
在编程中,哨兵值是一种简单的方式,用来跟踪一列项目的结束。比如说,你有一列项目,可以把最后一项设置为一个特殊的项目。当你遇到这个特殊的项目时,就知道到了列表的末尾。
表情符号示例:
😀 🥰 😎 🤗 🙄 😜 😮 💨 🐈
最后一个是猫,它不是笑脸,因此我们可以用猫的存在来表示我们已经到了列表的末尾。
这个编程模式的一个典型使用场景是以null字符结尾的文本字符串,在字符串的末尾会用\0标识。要计算字符串的长度,只需要遍历字符串,直到找到null字符为止。这个null字符就是哨兵值。
这是字符串 "String",其中最后的 \0 字符是哨兵值:
S t r i n g \0
另一个使用场景是链接列表中的空指针值。如果列表中的每个成员都是非空指针,则可以用空指针来表示列表的结束。
牙膏管理中的哨兵值应用
我发现在日常生活中管理牙膏时,这个编程技巧非常有用。当你最需要牙膏时发现它用完了,这是非常不妙的。你肯定不想在出门前刷牙时才发现没牙膏了。
因此,当我买牙膏时,会买很多支,并确保其中有一支牙膏与其他不同——这就是哨兵牙膏。
当我发现只剩下这支特别的哨兵牙膏时,我就知道该去买新的牙膏了,而且我有充足的时间去买。
我如何学到哨兵对象技巧
我第一次接触哨兵对象技巧是在Lennart Andersson教授的一堂编程课上,他是我计算机科学和编程方面的第一批老师之一,也是一个伟大的计算机科学家和教师。我从Lennart那里学到了许多非常有用的编程技巧,这些技巧在我的职业生涯中起到了重要作用,但这是唯一一个在计算机科学和编程之外的生活中也很有用的技巧。
以下是我从Lennart那里学到的一些其他有用的东西:
- 如何高效地为形式语言(如数学表达式和编程语言)编写解析器。
- 函数式编程技术如何令人满意地紧凑,特别是在使用map、reduce和filter操作时,即便是在命令式语言中。
打印机和PostScript语言的奇妙发现
他还教会了我一些打印机不仅仅是简单设备的道理——它们并不只是输出位图,实际上它们运行着一种叫做PostScript的完整语言。因此,你可以手动编写一段代码,发送给打印机,它会运行代码并生成输出——直接在纸上。这对我来说简直是个发现!
处理浮点数比较的技巧
如何避免直接比较两个浮点值——而是通过相减并检查它们之间的差值是否足够小。换句话说,避免检查a == b,而是检查abs(a - b) < 0.0001(或者其他某个小数值)。这是防止浮点数表示中的微小数值误差的巧妙方法。
数据结构外部与内部表示的重要性
我们曾被分配一个实验任务,要求编写一个小型的Excel/VisiCalc克隆程序。我们可以自由选择任何方式来实现,唯一的限制是我们不允许使用二维数组来表示电子表格的内容。这样做的目的是教我们外部可见的表示(一个二维的单元格表格)与程序内部的最佳表示方法并不一定相关。这给我留下了深刻的印象。