最奇特的編程語(yǔ)言特征
目前為止,據(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ù)組可以這樣索引取值:
- a[10]
這種寫(xiě)法相當(dāng)常見(jiàn)。 然而,還有一種很少見(jiàn)的寫(xiě)法(絕對(duì)可用!)是這樣的:
- 10[a]
這兩種寫(xiě)法的效果是一樣的。
在JavaScript里:
- '5' + 3 結(jié)果是 '53'
而
- '5' - 3 結(jié)果是 2
在JavaScript里,下面的語(yǔ)法結(jié)構(gòu)
- return
- {
- id : 1234,
- title : 'Tony the Pony'
- };
會(huì)提示語(yǔ)法錯(cuò)誤:”缺少分號(hào)”。而下面的寫(xiě)法卻能按你預(yù)想的結(jié)果運(yùn)行:
- return {
- id : 1234,
- title : 'Tony the Pony'
- };
更讓人郁悶的是下面的寫(xiě)法竟然可以(至少在谷歌瀏覽器里是這樣的):
- return /*
- */{
- id : 1234,
- title : 'Tony the Pony'
- };
下面的例子也是同樣的問(wèn)題引起的,但不會(huì)報(bào)錯(cuò),而你卻得不到想要的結(jié)果:
- return
- 2 + 2;
JavaScript的等式對(duì)照表:
- '' == '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
Java里有趣的自動(dòng)打包(auto boxing)和IntegerCache:
- Integer foo = 1000;
- Integer bar = 1000;
- foo = bar; // true
- foo == bar; // false
- //然而,如果 foo 和 bar 的值介于 127 和 -128 之間,
- //情況會(huì)發(fā)生變化:
- Integer foo = 42;
- Integer bar = 42;
- foo = bar; // true
- foo == bar; // true
解釋
在Java源代碼里你很快能翻出下面的內(nèi)容:
- /**
- * Returns a Integer instance representing the specified
- * int value.
- * If a new Integer instance is not required, this method
- * should generally be used in preference to the constructor
- * {@link #Integer(int)}, as this method is likely to yield
- * significantly better space and time performance by caching
- * frequently requested values.
- *
- * @param i an int value.
- * @return a Integer instance representing i.
- * @since 1.5
- */
- public static Integer valueOf(int i) {
- 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里:
- try {
- return true;
- } finally {
- return false;
- }
在Python和JavaScript也可以這樣寫(xiě)。這樣寫(xiě)的結(jié)果是什么?當(dāng)作一個(gè)保留的問(wèn)題考考大家吧。
C++的模板可以做很多奇怪的事情,***的例證是 “多維模擬排版”,你可以用模板來(lái)計(jì)算“畫(huà)出的”形狀。下面是一段計(jì)算一個(gè)3×3矩形的有效的C++代碼:
- #include"analogliterals.hpp"
- using namespace analog_literals::symbols;
- unsigned int c = ( o-----o
- | !
- ! !
- ! !
- o-----o ).area;
這還有一個(gè)3D立方體的例子:
- assert( ( o-------------o
- |L \
- | L \
- | L \
- | o-------------o
- | ! !
- ! ! !
- o | !
- L | !
- L | !
- L| !
- o-------------o ).volume == ( o-------------o
- | !
- ! !
- ! !
- o-------------o ).area * int(I-------------I)
#p#
PHP處理數(shù)字字符
- "01a4" != "001a4"
如果兩個(gè)字符串來(lái)的字符數(shù)不相等,它們不可能相等。前面的零非常重要,因?yàn)樗麄兪亲址皇菙?shù)字。
- "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ǔ)句:
- IF IF THEN THEN = ELSE ELSE ELSE = THEN
(IF, THEN, ELSE 都是變量名),或
- IF IF THEN THEN ELSE ELSE
(IF 是變量,THEN 和 ELSE 都是函數(shù))
JavaScript里八進(jìn)制的轉(zhuǎn)換:
- parseInt('06') // 6
- parseInt('07') // 7
- parseInt('08') // 0
- parseInt('09') // 0
- parseInt('10') // 10
在C語(yǔ)言里,你可以把 do/while 語(yǔ)句和 switch 交織在一起,下面就是一個(gè)使用這種方法的內(nèi)存拷貝的例子:
- 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);
- }
- }
在Python中:
- >>> x=5
- >>> 1>> 1
在Java中:
- int[] numbers() {
- return null;
- }
可以被寫(xiě)成:
- int numbers() [] {
- return null;
- }
如果你覺(jué)得還沒(méi)看夠,請(qǐng)到這里,還有更多。
原文:http://www.aqee.net/strangest-language-feature/
【編輯推薦】