细数那些令人发狂的程序语言的特性
这些最为奇怪的程序语言的特性,来自stackoverflow.com,原贴在这里。我摘选了一些例子,的确是比较怪异,让我们一个一个来看看。
1、C语言中的数组在C/C++中,a[10] 可以写成 10[a]
“Hello World”[i] 也可以写成?i["Hello World"]?
2、在Javascript中??’5′ + 3 的结果是:’53′
?’5′ 3 的结果是:2 ? ? ? ? ? ? ?更多javascript点击这里
3、C/C++中的Trigraphs?int main() { cout << "LOL??!";}?上面的这段程序会输出:?“LOL|”,这是因为 ??!?被转成了 | ,关于Trigraphs,下面有个表格:?
??=#??([??/\??)]??’^??<{??!|??>}??-~ 4、JavaScript 的条件表?看到下面这个表,不难理解为什么Javascript程序员为什么痛苦了
'' == '0' //false0 == '' //true0 == '0' //truefalse == 'false' //falsefalse == '0' //truefalse == undefined //falsefalse == null //falsenull == undefined //true" \t\r\n" == 0 //true
?
5、Java的Integer cacheInteger foo = 1000;Integer bar = 1000;foo <= bar; // truefoo >= bar; // truefoo == bar; // false//然后,如果你的 foo 和 bar 的值在 127 和 -128 之间(包括)//那么,其行为则改变了:Integer foo = 42;Integer bar = 42;foo <= bar; // truefoo >= bar; // truefoo == 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); }5、Perl的那些奇怪的变量$.$_$_#$$$[@_
?其所有的这些怪异的变量请参看:http://www.kichwa.com/quik_ref/spec_variables.html
?6、Java的异常返回请看下面这段程序,你觉得其返回true还是false?
try { return true;} finally { return false;}?在?javascript 和python下,其行为和Java的是一样的。?
7、C语言中的Duff device下面的这段程序你能看得懂吗?这就是所谓的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); }} 8、PHP中的字符串当函数用PHP中的某些用法也是很怪异的
$x = "foo";function foo(){ echo "wtf"; }$x();9、在C++中,你可以使用空指针调用静态函数class Foo { public: static void bar() { std::cout << "bar()" << std::endl; }};呵呵。的确是挺怪异的。
alert(parseInt("010")); //输出8alert(parseInt("010")); //输出8这个没错,因为前面的0表示8进制alert(parseInt("010")); //输出8
火星了?$x = "foo";function foo(){ echo "wtf"; }$x();
这样才叫“动态”语言么,这个可以有,虽然我从来不用哈public class ReturnInTryFinally {/** * @param args */public static void main(String[] args) {ReturnInTryFinally returnInTryFinally = new ReturnInTryFinally();System.out.println(returnInTryFinally.runWithBoolean());System.out.println(returnInTryFinally.runWithInt());System.out.println(returnInTryFinally.runWithObject());}private boolean runWithBoolean() {try {return true;} finally {return false;}}private int runWithInt() {int i = 0;try {i++;return i;} finally {i = 6;}}private MyObj runWithObject() {MyObj myObj = new MyObj();try {myObj.setB(true);myObj.setI(0);return myObj;} finally {myObj.setB(false);myObj.setI(6);}}class MyObj {private int i = 0;private boolean b = true;public int getI() {return i;}public void setI(int i) {this.i = i;}public boolean isB() {return b;}public void setB(boolean b) {this.b = b;}@Overridepublic String toString() {return "i=" + i + "; b=" + b;}}} 7 楼 jyjava 2011-12-11 细节决定成败