最奇特的编程语言特征
至今为止,从我个人的观察来看,从语法角度来说,LISP语言似乎是最受争议的一种语言。当你打开LISP的代码时,满眼都是层层叠叠的括号,仿佛陷入了一个无尽的括号海洋。
让我分享一个小插曲:有一天下午,一名间谍急匆匆地返回总部,手中紧握一张纸,兴奋地对着他的长官大喊:
“报告!报告!美国人的火箭发射系统竟然是用Lisp语言编写的!”
长官不解地问道:“你怎么知道?”
间谍回答道:“我潜入了他们的研究实验室,从一台电报机上偷出了一张纸!虽然这只是程序的最后一页,记录了程序结束部分的逻辑,但足以说明问题!”
长官接过这张纸,看了一眼,笑了起来。他感慨地说:“这种语言特性的确十分独特,但遗憾的是,LISP语言的特点与人们的常规思维习惯不太相符。”其实每一种语言都有其独特的特性,其中有些可能会让人觉得奇怪甚至困惑。
有人在一篇帖子中征集了关于各种语言中不合常理的地方,结果收到了超过320条反馈,其中问题最多最有趣的语言是JavaScript,此外还有C、Java、Python、PHP等。下面列举其中几条最有趣的例子。
1. 在C语言中,数组可以通过这种方式取值:a[10],这种写法相当常见。还有一种少见的写法(但绝对可用):10[a],这两种写法功能相同。
2. 在JavaScript中,'5' + 3的结果是字符串'53',而'5' - 3的结果却是数字2。
1、JavaScript的奇特写法
你是否曾对JavaScript中的某些写法感到困惑?比如:
```javascript
return {id: 1234, title: 'Tony the Pony'};
```
更令人惊讶的是,下面的写法在谷歌浏览器中竟然可行:
```javascript
return //{id: 1234, title: 'Tony the Pony'};
```
类似的问题还出现在下面的例子中,虽然代码不会报错,但你可能得不到预期的结果:
```javascript
return2 + 2;
```
2、JavaScript的等式对比表
在JavaScript中,某些等式可能会让你大跌眼镜。例如:
```javascript
'' == '0' // 返回false
0 == '' // 返回true
0 == '0' // 返回true
false == 'false' // 返回false
false == '0' // 返回true
false == undefined // 返回false
false == null // 返回false
null == undefined // 返回true
"\t\r" == 0 // 返回true
```
3、Java中的自动装箱(Auto-boxing)与IntegerCache的奥秘
在Java中,有时你会发现这样的代码:
```java
Integer foo = 1000;
Integer bar = 1000;
foo <= bar; // 返回true
foo >= bar; // 返回true
foo == bar; // 返回false(在特定值范围内)
```
这种行为背后的原因是Java的IntegerCache机制。当整数值在-128到127之间时,Java会自动从IntegerCache中获取已存在的实例,而不是创建新的对象。在上述范围内比较Integer对象时,它们实际上是指向同一个对象,所以`==`操作返回true。了解这一点对于正确使用Java的自动装箱特性至关重要。正确的做法是使用`.equals()`方法来比较Integer对象的内容。
4、Java中的try-finally块
关于Java的try-finally块,有一个有趣的问题:
```java
try {
return true;
} finally {
return false;
}
```
这段代码的结果是什么呢?这个问题可以作为对读者的小考验。在Python和JavaScript中也有类似的语法,结果如何?思考一下。
5、C++模板的魔力
让我们看一下如何用C++计算一个神秘的3x3矩形区域的面积。引入了一个特殊的头文件 "analogliterals.hpp",并使用了其中的符号命名空间analog_literals::symbols。通过一段富有象征意义的图形描述,我们定义了一个对象c,其面积由这个图形的区域所代表。代码中的符号“o-----o”和“!”构成了一个独特的图案,而其面积被赋值给了变量c。
接下来,让我们转向一个关于3D立方体的例子。这段代码似乎在验证一个复杂的空间几何问题。它似乎是在确认一个立方体的体积是否等于某个形状的面积乘以一个未知的数值I-------------I。这其中的符号构成了一个复杂的立体图形描述,其中涉及多个层次和维度。这段代码展示了在编程中处理复杂几何问题的挑战性和趣味性。
现在让我们转向关于PHP处理数字字符的部分。这里揭示了PHP在处理数字字符时的一些有趣行为。当字符串中的字符数量不相等时,"01a4"并不等于"001a4",因为PHP在处理这些字符串时,会将它们视为数字而非字符。对于像"01e4"这样的字符串,PHP会将其视为数字,即使它们是以科学计数法的形式表示的。这意味着开头的零对于数字来说并不重要,这是PHP的一种特殊处理方式。PHP还会认为一些看似不同的字符串实际上是相等的,如“01e4”等于“10000”,这是因为在数值上它们是相等的。尽管这种行为有其逻辑基础,但对于初学者来说可能会感到困惑和不合理。
这些代码示例展示了编程中的有趣和复杂性,让我们更深入地了解计算机如何处理不同的数据类型和几何问题。也揭示了不同编程语言在处理这些问题时的独特方式和特点。9、在PL/I这样的无保留字、关键字的语言中,代码语句可以既有趣又合法
想象一下这样的语句:
IF(IF作为变量名) THEN(THEN和ELSE作为函数名) THEN = ELSE ELSE ELSE = THEN
或者更有趣的:IF IF THEN THEN ELSE ELSE这样的组合。这样的语言特性为我们提供了广阔的创意空间。
10、JavaScript中的八进制转换奥秘
在JavaScript中,八进制数的前缀是0。例如:
parseInt('06') // 返回6
parseInt('07') // 返回7
请注意,JavaScript并不支持八进制的数字超过7,所以:
parseInt('08') // 返回0,因为八进制没有数字8
parseInt('09') // 同样返回0,因为没有八进制的数字9
parseInt('10') // 返回10,因为这里已经是十进制了。
11、C语言中的do/while与switch的完美结合
在C语言中,我们可以将do/while循环与switch语句巧妙地结合,实现一些高级功能。以下是一个内存拷贝的例子:
```c
void duff_memcpy(char to, char from, size_t count) {
size_t n = (count + 7) / 8; // 先进行一个简单的预处理操作
switch (count % 8) { // 根据剩余的字节数进行操作
case 0: do { to++ = from++; // 如果字节数是8的倍数,则正常复制数据并移动指针位置
case 7: to++ = from++; // 当case 7结束时直接继续复制数据并移动指针位置,无需额外判断条件。这种技巧被称为Duff的装置或Duff循环。接下来的每个case都是类似的逻辑。通过这种方式,我们可以有效地处理不同大小的内存拷贝操作。这种结合使用do/while和switch的方式展示了C语言的强大和灵活。怎么样?有意思吧!希望你会觉得有趣和满足。更多的信息可以在这里找到:
文章从网络整理,文章内容不代表本站观点,转账请注明【蓑衣网】