最为奇怪的程序语言的特性

这些最为奇怪的程序语言的特性,来自stackoverflow.com,原贴在这里。我摘选了一些例子,的确是比较怪异,让我们一个一个来看看。 

1、C语言中的数组 

在C/C++中,a[10] 可以写成 10[a] 

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

这样的特性是不是很怪异?如果你想知道为什么的话,你可以看看本站的这篇文章——《C语言的谜题》中的第12题。 

2、在Javascript中 

 ’5′ + 3 的结果是:’53′
 ’5′ – 3 的结果是:2 

3、C/C++中的Trigraphs 

1
2
3
int main() {
    cout << "LOL??!" ;
}

上面的这段程序会输出: “LOL|”,这是因为 ??! 被转成了 | ,关于Trigraphs,下面有个表格: 

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

  

4、JavaScript 的条件表 

看到下面这个表,不难理解为什么Javascript程序员为什么痛苦了——《Javascript程序员嘴最脏??》 

1
2
3
4
5
6
7
8
9
''        ==   '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

 

5、Java的Integer cache 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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,下面是相关的程序,注意其中的注释

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
      * 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);
     }

5、Perl的那些奇怪的变量

1
2
3
4
5
6
$.
$_
$_ #
$$
$[
@_

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

6、Java的异常返回

请看下面这段程序,你觉得其返回true还是false?

1
2
3
4
5
try {
     return true ;
} finally {
     return false ;
}

在 javascript 和python下,其行为和Java的是一样的。 

7、C语言中的Duff device

下面的这段程序你能看得懂吗?这就是所谓的Duff Device,相当的怪异。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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);
     }

8、PHP中的字符串当函数用

PHP中的某些用法也是很怪异的

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

9、在C++中,你可以使用空指针调用静态函数

1
2
3
4
5
6
7
8
9
10
11
12
class Foo {
   public :
     static void bar() {
       std::cout << "bar()" << std::endl;
     }
};
  
int main( void ) {
   Foo * foo = NULL;
   foo->bar(); //=> WTF!?
   return 0; // Ok!
}

呵呵。的确是挺怪异的。

http://coolshell.cn/articles/2053.html

转载于:https://www.cnblogs.com/kuangxiangjie/archive/2010/11/26/1888314.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值