最奇特的编程语言特征
来源:互联网 发布:suse linux配置ntp 编辑:程序博客网 时间:2024/04/29 14:43
目前为止,据我个人观察,从语法角度上讲,最被人诟病的一种语言应该是LISP语言了。打开这种语言的代码,一眼望去,满目全是括弧,一层套一层。
在此插播一个小笑话:一天下午,一个间谍气喘吁吁的回到总部,手里拿着一张纸,兴奋的对着他的上司叫喊:
“同志!同志!美国人的火箭发射系统是用Lisp语言编写的!”
长官很疑惑:
“你怎么知道的?”
间谍说:
“我闯进了他们的研究室,从他们的电报机上偷了一张纸!这上面不是整个程序,只是最后一页,记录了程序的结束部分的逻辑!你自己看!!!!”
长官看着这张纸笑了:
这种语言特征最大的问题是,它不符合人们通常的思维习惯。LISP语言的这个特点是个整体的语言现象,而任何一种语言其实也都有一些个别的很奇特的东西,其中有些会奇怪的让你摸不着头脑。
有一个好事者在一个帖子上征集各种语言里不合常理的地方,结果收集到了320多条,问题最大最多的语言算是Javascript了,另外还有C,Java,Python,PHP等等。下面列出的是其中最有趣的几条。
1、在C语言里,数组可以这样索引取值
a[10]
这种写法相当常见。
然而,还有一种很少见的写法(绝对可用!)是这样的:
10[a]
这两种写法的效果是一样的。
2、在JavaScript里
'5' + 3 结果是 '53'
而
'5' - 3 结果是 2
3、在JavaScript里,下面的语法结构
return{id : 1234,title : 'Tony the Pony'};
会提示语法错误:”缺少分号”。而下面的写法却能按你预想的结果运行:
return {id : 1234,title : 'Tony the Pony'};
更让人郁闷的是下面的写法竟然可以(至少在谷歌浏览器里是这样的):
return /**/{id : 1234,title : 'Tony the Pony'};
下面的例子也是同样的问题引起的,但不会报错,而你却得不到想要的结果:
return2 + 2;
4、JavaScript的等式对照表
'' == '0' // false0 == '' // true0 == '0' // truefalse == 'false' // falsefalse == '0' // truefalse == undefined // falsefalse == null // falsenull == undefined // true" \t\r\n" == 0 // true
5、Java里有趣的自动打包(auto boxing)和IntegerCache
Integer foo = 1000;Integer bar = 1000;foo <= bar; // truefoo >= bar; // truefoo == bar; // false//However, if the values of foo and bar are between 127 and -128 (inclusive)//the behaviour changes:Integer foo = 42;Integer bar = 42;foo <= bar; // truefoo >= bar; // truefoo == bar; // true
解释:在Java源代码里你很快能翻出下面的内容:
/*** Returns a <tt>Integer</tt> instance representing the specified* <tt>int</tt> value.* If a new <tt>Integer</tt> instance is not required, this method* should generally be used in preference to the constructor* {@link #Integer(int)}, as this method is likely to yield* significantly better space and time performance by caching* frequently requested values.** @param i an <code>int</code> value.* @return a <tt>Integer</tt> instance representing <tt>i</tt>.* @since 1.5* public static Integer valueOf(int i) {if (i >= -128 && i <= IntegerCache.high)return IntegerCache.cache[i + 128];elsereturn new Integer(i);}
注意; IntegerCache.high 的值,如果你不设置它,缺省是 127。
自动打包(auto boxing)过程中发生的事情是:除非显式的创建:比如 foo = new Integer(42) ,否则 foo 和 bar 都是从缓存中取出的整数,当比较值时,它们会返回 true。正确的比较Integer的方式是使用 .equals 。
6、在Java里
try {return true;} finally {return false;}
在Python和JavaScript也可以这样写。这样写的结果是什么?当作一个保留的问题考考大家吧。
7、C++的模板可以做很多奇怪的事情
最好的例证是 “多维模拟排版”,你可以用模板来计算“画出的”形状。下面是一段计算一个3×3矩形的有效的C++代码:
#include"analogliterals.hpp"using namespace analog_literals::symbols; unsigned int c = ( o-----o | ! ! ! ! ! o-----o ).area;
这还有一个3D立方体的例子:
assert( ( o-------------o |L \ | L \ | L \ | o-------------o | ! ! ! ! ! o | ! L | ! L | ! L| ! o-------------o ).volume == ( o-------------o | ! ! ! ! ! o-------------o ).area * int(I-------------I) );
8、PHP处理数字字符
"01a4" != "001a4"
如果两个字符串来的字符数不相等,它们不可能相等。前面的零非常重要,因为他们是字符而不是数字。
"01e4" == "001e4"
PHP不太喜欢字符,它会寻找任何的借口来把你提供的值当作数字。把这些十六进制的字符串稍微做些改动,PHP马上认为它们不再是字符,而是数字。
它们是按科学计数法写的数字(PHP并不在意你是否用了引号),它们是相等的,因为对于数字来说,前面的零是可以忽略的。
更强化这个事实的例子是,你会发现PHP认为 “01e4″ == “10000” 是正确的,因为作为数字,它们的值是相当的。这是一个被特别提醒的语言特征,原因就是它不太合理。
9、在一些没有保留字、关键字的语言里,例如PL/I, 你可以写出这样有趣而且合法的代码语句
IF IF THEN THEN = ELSE ELSE ELSE = THEN
(IF, THEN, ELSE 都是变量名),或
IF IF THEN THEN ELSE ELSE
(IF 是变量,THEN 和 ELSE 都是函数)
10、JavaScript里八进制的转换
parseInt('06') // 6parseInt('07') // 7parseInt('08') // 0parseInt('09') // 0parseInt('10') // 10
11、在C语言里,你可以把 do/while 语句和 switch 交织在一起
下面就是一个使用这种方法的内存拷贝的例子:
void duff_memcpy( char* to, char* from, size_t count ) {
(<a href="http://www.dztcsd.com/">资质代办</a>) size_t n = (count+7)/8; switch( count%8 ) { case 0: do{ *to++ = *from++; case 7: *to++ = *from++; case 6: *to++ = *from++; case 5: *to++ = *from++; case 4: *to++ = *from++; case 3: *to++ = *from++; case 2: *to++ = *from++; case 1: *to++ = *from++; }while(--n>0); }}
12、在Python中
>>> x=5>>> 1<x<10True>>> 1<x<3False
13、在Java中
int[] numbers() {return null;}
可以被写成:
int numbers() [] {return null;}
- 最奇特的编程语言特征
- 最奇特的编程语言特征
- 最奇特的编程语言特征
- 最奇特的编程语言特征
- 最奇特的编程语言和语句,绝对亮瞎了
- C语言奇特的声明
- 世上设计最奇特的八座桥(组图)
- 世界上最奇特的八个网站
- 围观全球最奇特的电梯(图)
- 最难的编程语言
- 最奇特的方式理解LinuxUSB设备驱动
- 主要几种编程语言的OEP特征段
- 常见编程语言的OEP入口点特征
- 最牛X的编程语言
- 哪些编程语言是最流行的
- 有史以来最出彩的编程语言名字
- 有史以来最出彩的编程语言名字
- 有史以来最出彩的编程语言名字
- 10046---http://www.ha97.com/5095.html
- Android服务Service使用总结
- 前端与SEO ②:页面渲染
- 目前流行框架的一些替代技术
- andorid SQLite 的使用详解
- 最奇特的编程语言特征
- 新浪云 SVN Update代码过慢
- apt-add-repository
- 实用开发平台对比分析
- listView 条目错乱的问题
- GStreamer集成GUI工具编译通过,有排错过程
- SpringMVC的文件上传功能
- luci的实现框架 ----我的笔记(2.3)
- Codeforces-----233C---Cycles模拟