【转】细数那些令人发狂的程序语言的特性

[b]1、C语言中的数组[/b]
在C/C++中,a[10] 可以写成 10[a]

“Hello World”[i] 也可以写成 i["Hello World"]

[b]2、在Javascript中[/b]
'5' + 3 的结果是:'53'

'5' – 3 的结果是:2

[b]3、C/C++中的Trigraphs [/b]
int main() {   
cout << "LOL??!";
}

int main() {
cout << "LOL??!";
}
上面的这段程序会输出: “LOL|”,这是因为 ??! 被转成了 | ,关于Trigraphs,下面有个表格:

[table]
|??= | # |
|??( | [ |
|??/ | \ |
|??) | ] |
|??’| ^ |
|??< | { |
|??! | 丨|
|??> | } |
|??- | ~ |
[/table]

[b]4、JavaScript 的条件表 [/b]
看到下面这个表,不难理解为什么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\n" == 0 //true

'' == '0' //false
0 == '' //true
0 == '0' //true
false == 'false' //false
false == '0' //true
false == undefined //false
false == null //false
null == undefined //true
" \t\r\n" == 0 //true


[b]5、Java的Integer cache[/b]
Integer foo = 1000;   
Integer bar = 1000;

foo <= bar; // true
foo >= bar; // true
foo == bar; // false

//然后,如果你的 foo 和 bar 的值在 127 和 -128 之间(包括)
//那么,其行为则改变了:

Integer foo = 42;
Integer bar = 42;

foo <= bar; // true
foo >= bar; // true
foo == bar; // true

Integer foo = 1000;
Integer bar = 1000;

foo <= bar; // true
foo >= bar; // true
foo == bar; // false

//然后,如果你的 foo 和 bar 的值在 127 和 -128 之间(包括)
//那么,其行为则改变了:

Integer foo = 42;
Integer bar = 42;

foo <= bar; // true
foo >= bar; // true
foo == bar; // true

为什么会这样呢?你需要了解一下Java Interger Cache,下面是相关的程序,注意其中的注释

/**

* 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
* <a href="mailto:{@link">{@link</a> #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];
else
return new Integer(i);
}

[b]5、Perl的那些奇怪的变量[/b]

$.
$_
$_#
$$
$[
@_

其所有的这些怪异的变量请参看:[url]http://www.kichwa.com/quik_ref/spec_variables.html[/url]

[b]6、Java的异常返回[/b]
请看下面这段程序,你觉得其返回true还是false?
try {   
return true;
} finally {
return false;
}

try {
return true;
} finally {
return false;
}
在 javascript 和python下,其行为和Java的是一样的。

[b]7、C语言中的Duff device[/b]
下面的这段程序你能看得懂吗?这就是所谓的Duff Device,相当的怪异。
void duff_memcpy( char* to, char* from, size_t count ) {   
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);
}
}

void duff_memcpy( char* to, char* from, size_t count ) {
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);
}
}

[b]8、PHP中的字符串当函数用[/b]
PHP中的某些用法也是很怪异的
$x = "foo";   
function foo(){ echo "wtf"; }
$x();

$x = "foo";
function foo(){ echo "wtf"; }
$x();

[b]9、在C++中,你可以使用空指针调用静态函数[/b]
class Foo {   
public:
static void bar() {
std::cout << "bar()" << std::endl;
}
};

class Foo {
public:
static void bar() {
std::cout << "bar()" << std::endl;
}
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值