- 论坛徽章:
- 0
|
【转】细数那些令人发狂的程序语言的特性
1、C语言中的数组
在C/C++中,a[10] 可以写成 10[a]
“Hello World” 也可以写成 i["Hello World"]
2、在Javascript中
'5' + 3 的结果是:'53'
'5' – 3 的结果是:2
3、C/C++中的Trigraphs
Cpp代码- 1.int main() {
- 2. cout << "LOL??!";
- 3.}
- 4.
- 5.int main() {
- 6. cout << "LOL??!";
- 7.}
- int main() {
- cout << "LOL??!";
- }
- int main() {
- cout << "LOL??!";
- }
复制代码 上面的这段程序会输出: “LOL|”,这是因为 ??! 被转成了 | ,关于Trigraphs,下面有个表格:
??= #
??( [
??/ \
??) ]
??’ ^
??< {
??! 丨
??> }
??- ~
4、JavaScript 的条件表
看到下面这个表,不难理解为什么Javascript程序员为什么痛苦了
Js代码- 1.'' == '0' //false
- 2.0 == '' //true
- 3.0 == '0' //true
- 4.false == 'false' //false
- 5.false == '0' //true
- 6.false == undefined //false
- 7.false == null //false
- 8.null == undefined //true
- 9." \t\r\n" == 0 //true
- 10.
- 11.'' == '0' //false
- 12.0 == '' //true
- 13.0 == '0' //true
- 14.false == 'false' //false
- 15.false == '0' //true
- 16.false == undefined //false
- 17.false == null //false
- 18.null == undefined //true
- 19." \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
- '' == '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
Java代码- 1.Integer foo = 1000;
- 2.Integer bar = 1000;
- 3.
- 4.foo <= bar; // true
- 5.foo >= bar; // true
- 6.foo == bar; // false
- 7.
- 8.//然后,如果你的 foo 和 bar 的值在 127 和 -128 之间(包括)
- 9.//那么,其行为则改变了:
- 10.
- 11.Integer foo = 42;
- 12.Integer bar = 42;
- 13.
- 14.foo <= bar; // true
- 15.foo >= bar; // true
- 16.foo == bar; // true
- 17.
- 18.Integer foo = 1000;
- 19.Integer bar = 1000;
- 20.
- 21.foo <= bar; // true
- 22.foo >= bar; // true
- 23.foo == bar; // false
- 24.
- 25.//然后,如果你的 foo 和 bar 的值在 127 和 -128 之间(包括)
- 26.//那么,其行为则改变了:
- 27.
- 28.Integer foo = 42;
- 29.Integer bar = 42;
- 30.
- 31.foo <= bar; // true
- 32.foo >= bar; // true
- 33.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
- 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,下面是相关的程序,注意其中的注释
Java代码- 1./**
- 2.
- 3. * Returns a <tt>Integer</tt> instance representing the specified
- 4.
- 5. * <tt>int</tt> value.
- 6.
- 7. * If a new <tt>Integer</tt> instance is not required, this method
- 8.
- 9. * should generally be used in preference to the constructor
- 10. * <a href="mailto:{@link">{@link</a> #Integer(int)}, as this method is likely to yield
- 11. * significantly better space and time performance by caching
- 12. * frequently requested values.
- 13. *
- 14. * @param i an <code>int</code> value.
- 15. * @return a <tt>Integer</tt> instance representing <tt>i</tt>.
- 16. * @since 1.5
- 17. */
- 18. public static Integer valueOf(int i) {
- 19. if(i >= -128 && i <= IntegerCache.high)
- 20. return IntegerCache.cache[i + 128];
- 21. else
- 22. return new Integer(i);
- 23. }
- /**
- * 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的那些奇怪的变量
Perl代码- 1.$.
- 2.$_
- 3.$_#
- 4.$$
- 5.$[
- 6.@_
- $.
- $_
- $_#
- $$
- $[
- @_
复制代码 其所有的这些怪异的变量请参看:http://www.kichwa.com/quik_ref/spec_variables.html
6、Java的异常返回
请看下面这段程序,你觉得其返回true还是false?
Java代码- 1.try {
- 2. return true;
- 3.} finally {
- 4. return false;
- 5.}
- 6.
- 7.try {
- 8. return true;
- 9.} finally {
- 10. return false;
- 11.}
- try {
- return true;
- } finally {
- return false;
- }
- try {
- return true;
- } finally {
- return false;
- }
复制代码 在 javascript 和python下,其行为和Java的是一样的。
7、C语言中的Duff device
下面的这段程序你能看得懂吗?这就是所谓的Duff Device,相当的怪异。
C代码- 1.void duff_memcpy( char* to, char* from, size_t count ) {
- 2. size_t n = (count+7)/8;
- 3. switch( count%8 ) {
- 4. case 0: do{ *to++ = *from++;
- 5. case 7: *to++ = *from++;
- 6. case 6: *to++ = *from++;
- 7. case 5: *to++ = *from++;
- 8. case 4: *to++ = *from++;
- 9. case 3: *to++ = *from++;
- 10. case 2: *to++ = *from++;
- 11. case 1: *to++ = *from++;
- 12. }while(--n>0);
- 13. }
- 14.}
- 15.
- 16.void duff_memcpy( char* to, char* from, size_t count ) {
- 17. size_t n = (count+7)/8;
- 18. switch( count%8 ) {
- 19. case 0: do{ *to++ = *from++;
- 20. case 7: *to++ = *from++;
- 21. case 6: *to++ = *from++;
- 22. case 5: *to++ = *from++;
- 23. case 4: *to++ = *from++;
- 24. case 3: *to++ = *from++;
- 25. case 2: *to++ = *from++;
- 26. case 1: *to++ = *from++;
- 27. }while(--n>0);
- 28. }
- 29.}
- 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);
- }
- }
复制代码 8、PHP中的字符串当函数用
PHP中的某些用法也是很怪异的
Php代码- 1.$x = "foo";
- 2.function foo(){ echo "wtf"; }
- 3.$x();
- 4.
- 5.$x = "foo";
- 6.function foo(){ echo "wtf"; }
- 7.$x();
- $x = "foo";
- function foo(){ echo "wtf"; }
- $x();
- $x = "foo";
- function foo(){ echo "wtf"; }
- $x();
复制代码 9、在C++中,你可以使用空指针调用静态函数
Cpp代码- 1.class Foo {
- 2. public:
- 3. static void bar() {
- 4. std::cout << "bar()" << std::endl;
- 5. }
- 6.};
- 7.
- 8.class Foo {
- 9. public:
- 10. static void bar() {
- 11. std::cout << "bar()" << std::endl;
- 12. }
- 13.};
- class Foo {
- public:
- static void bar() {
- std::cout << "bar()" << std::endl;
- }
- };
- class Foo {
- public:
- static void bar() {
- std::cout << "bar()" << std::endl;
- }
- };
复制代码 |
|