自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

最奇特的編程語(yǔ)言特征

開(kāi)發(fā) 前端 開(kāi)發(fā)工具
有一個(gè)好事者在一個(gè)帖子上征集各種語(yǔ)言里不合常理的地方,結(jié)果收集到了320多條,問(wèn)題最大最多的語(yǔ)言算是Javascript了,另外還有C,Java,Python,PHP等等。下面列出的是其中最有趣的幾條。

目前為止,據(jù)我個(gè)人觀察,從語(yǔ)法角度上講,最被人詬病的一種語(yǔ)言應(yīng)該是LISP語(yǔ)言了。打開(kāi)這種語(yǔ)言的代碼,一眼望去,滿目全是括弧,一層套一層。 這種語(yǔ)言特征***的問(wèn)題是,它不符合人們通常的思維習(xí)慣。LISP語(yǔ)言的這個(gè)特點(diǎn)是個(gè)整體的語(yǔ)言現(xiàn)象,而任何一種語(yǔ)言其實(shí)也都有一些個(gè)別的很奇特的東西, 其中有些會(huì)奇怪的讓你摸不著頭腦。有一個(gè)好事者在一個(gè)帖子上征集各種語(yǔ)言里不合常理的地方,結(jié)果收集到了320多條,問(wèn)題***最多的語(yǔ)言算是Javascript了,另外還有C,Java,Python,PHP等等。下面列出的是其中最有趣的幾條。

在C語(yǔ)言里,數(shù)組可以這樣索引取值:

  1. a[10]  

這種寫(xiě)法相當(dāng)常見(jiàn)。 然而,還有一種很少見(jiàn)的寫(xiě)法(絕對(duì)可用!)是這樣的:

  1. 10[a]  

這兩種寫(xiě)法的效果是一樣的。

在JavaScript里:

  1. '5' + 3 結(jié)果是 '53'  

  1. '5' - 3 結(jié)果是 2  

在JavaScript里,下面的語(yǔ)法結(jié)構(gòu)

  1. return 
  2. {  
  3.     id : 1234,  
  4.     title : 'Tony the Pony' 
  5. }; 

會(huì)提示語(yǔ)法錯(cuò)誤:”缺少分號(hào)”。而下面的寫(xiě)法卻能按你預(yù)想的結(jié)果運(yùn)行:

  1. return {  
  2.     id : 1234,  
  3.     title : 'Tony the Pony' 
  4. }; 

更讓人郁悶的是下面的寫(xiě)法竟然可以(至少在谷歌瀏覽器里是這樣的):

  1. return /*  
  2. */{  
  3.     id : 1234,  
  4.     title : 'Tony the Pony' 
  5. }; 

下面的例子也是同樣的問(wèn)題引起的,但不會(huì)報(bào)錯(cuò),而你卻得不到想要的結(jié)果:

  1. return 
  2.     2 + 2; 

JavaScript的等式對(duì)照表:

  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 

Java里有趣的自動(dòng)打包(auto boxing)和IntegerCache:

  1. Integer foo = 1000;  
  2. Integer bar = 1000;  
  3.  
  4. foo = bar; // true  
  5. foo == bar; // false  
  6.  
  7. //然而,如果 foo 和 bar 的值介于 127 和 -128 之間,  
  8. //情況會(huì)發(fā)生變化:  
  9.  
  10. Integer foo = 42;  
  11. Integer bar = 42;  
  12.  
  13. foo = bar; // true  
  14. foo == bar; // true 

解釋

在Java源代碼里你很快能翻出下面的內(nèi)容:

  1. /**  
  2.  * Returns a Integer instance representing the specified  
  3.  * int value.  
  4.  * If a new Integer instance is not required, this method  
  5.  * should generally be used in preference to the constructor  
  6.  * {@link #Integer(int)}, as this method is likely to yield  
  7.  * significantly better space and time performance by caching  
  8.  * frequently requested values.  
  9.  *  
  10.  * @param  i an int value.  
  11.  * @return a Integer instance representing i.  
  12.  * @since  1.5  
  13.  */ 
  14. public static Integer valueOf(int i) {  
  15.     if (i >= -128 && i 

注意; IntegerCache.high 的值,如果你不設(shè)置它,缺省是 127。 自動(dòng)打包(auto boxing)過(guò)程中發(fā)生的事情是:除非顯式的創(chuàng)建:比如 foo = new Integer(42) ,否則 foo 和 bar 都是從緩存中取出的整數(shù),當(dāng)比較值時(shí),它們會(huì)返回 true。正確的比較Integer的方式是使用 .equals 。

在Java里:

  1. try {  
  2.     return true;  
  3. finally {  
  4.     return false;  

在Python和JavaScript也可以這樣寫(xiě)。這樣寫(xiě)的結(jié)果是什么?當(dāng)作一個(gè)保留的問(wèn)題考考大家吧。

C++的模板可以做很多奇怪的事情,***的例證是 “多維模擬排版”,你可以用模板來(lái)計(jì)算“畫(huà)出的”形狀。下面是一段計(jì)算一個(gè)3×3矩形的有效的C++代碼:

  1. #include"analogliterals.hpp"  
  2. using namespace analog_literals::symbols;  
  3.  
  4.           unsigned int c = ( o-----o  
  5.                              |     !  
  6.                              !     !  
  7.                              !     !  
  8.                              o-----o ).area; 

這還有一個(gè)3D立方體的例子:

  1. assert( ( o-------------o  
  2.            |L             \  
  3.            | L             \  
  4.            |  L             \  
  5.            |   o-------------o  
  6.            |   !             !  
  7.            !   !             !  
  8.            o   |             !  
  9.             L  |             !  
  10.              L |             !  
  11.               L|             !  
  12.                o-------------o ).volume == ( o-------------o  
  13.                                              |             !  
  14.                                              !             !  
  15.                                              !             !  
  16.                                              o-------------o ).area * int(I-------------I)  

#p#

PHP處理數(shù)字字符

  1. "01a4" != "001a4" 

如果兩個(gè)字符串來(lái)的字符數(shù)不相等,它們不可能相等。前面的零非常重要,因?yàn)樗麄兪亲址皇菙?shù)字。

  1. "01e4" == "001e4" 

PHP不太喜歡字符,它會(huì)尋找任何的借口來(lái)把你提供的值當(dāng)作數(shù)字。把這些十六進(jìn)制的字符串稍微做些改動(dòng),PHP馬上認(rèn)為它們不再是字符,而是數(shù)字。 它們是按科學(xué)計(jì)數(shù)法寫(xiě)的數(shù)字(PHP并不在意你是否用了引號(hào)),它們是相等的,因?yàn)閷?duì)于數(shù)字來(lái)說(shuō),前面的零是可以忽略的。更強(qiáng)化這個(gè)事實(shí)的例子是,你會(huì)發(fā) 現(xiàn)PHP認(rèn)為 “01e4″ == “10000″ 是正確的,因?yàn)樽鳛閿?shù)字,它們的值是相當(dāng)?shù)?。這是一個(gè)被特別提醒的語(yǔ)言特征,原因就是它不太合理。

在一些沒(méi)有保留字、關(guān)鍵字的語(yǔ)言里,例如PL/I, 你可以寫(xiě)出這樣有趣而且合法的代碼語(yǔ)句:

  1. IF IF THEN THEN = ELSE ELSE ELSE = THEN 

(IF, THEN, ELSE 都是變量名),或

  1. IF IF THEN THEN ELSE ELSE 

(IF 是變量,THEN 和 ELSE 都是函數(shù))

JavaScript里八進(jìn)制的轉(zhuǎn)換:

  1. parseInt('06'// 6  
  2. parseInt('07'// 7  
  3. parseInt('08'// 0  
  4. parseInt('09'// 0  
  5. parseInt('10'// 10 

在C語(yǔ)言里,你可以把 do/while 語(yǔ)句和 switch 交織在一起,下面就是一個(gè)使用這種方法的內(nèi)存拷貝的例子:

  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.     }  

在Python中:

  1. >>> x=5 
  2. >>> 1>> 1 

在Java中:

  1. int[] numbers() {  
  2.   return null;  

可以被寫(xiě)成:

  1. int numbers() [] {  
  2.   return null;  

如果你覺(jué)得還沒(méi)看夠,請(qǐng)到這里,還有更多。

原文:http://www.aqee.net/strangest-language-feature/

【編輯推薦】

  1. 提交中的罵聲:哪種編程語(yǔ)言最遭罵?
  2. 從過(guò)去5年編程語(yǔ)言的演化看未來(lái)趨勢(shì)
  3. 關(guān)于Node.js語(yǔ)言的討論
  4. Dart語(yǔ)言慣用語(yǔ)——Dart中特有的代碼味道
  5. 為什么說(shuō)設(shè)計(jì)是網(wǎng)站的肢體語(yǔ)言?
責(zé)任編輯:陳貽新 來(lái)源: 外刊IT評(píng)論
相關(guān)推薦

2014-02-04 19:44:23

編程語(yǔ)言開(kāi)發(fā)

2021-03-23 14:50:16

編程語(yǔ)言Rust漏洞

2013-04-11 09:51:43

編程語(yǔ)言

2012-03-30 13:56:17

編程開(kāi)發(fā)

2018-03-13 09:34:30

人工智能編程語(yǔ)言Python

2013-07-11 08:51:06

編程語(yǔ)言

2019-04-24 09:20:58

Go語(yǔ)言編程語(yǔ)言

2015-04-22 14:37:41

大數(shù)據(jù)大數(shù)據(jù)奇特應(yīng)用

2019-01-30 12:38:41

JavaScript前端編程語(yǔ)言

2018-01-02 14:00:16

編程語(yǔ)言Bug

2011-12-20 15:57:32

程序員

2012-03-27 09:36:59

編程語(yǔ)言

2018-01-10 08:45:57

編程語(yǔ)言PythonKotlin

2015-05-07 10:10:29

GitHub編程語(yǔ)言

2015-05-04 10:05:11

編程語(yǔ)言GitHub流行語(yǔ)言

2021-12-29 10:18:46

編程語(yǔ)言PythonJava

2017-12-12 23:22:52

2015-04-20 14:27:40

大數(shù)據(jù)奇特應(yīng)用

2018-06-06 16:25:44

碼農(nóng)出身奇特

2020-05-11 10:25:38

編程語(yǔ)言J開(kāi)發(fā)Python
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)