1. 程式人生 > >謎題17:嗯?

謎題17:嗯?

java程序 unicode 謎題 這不 sci oid tle ascii 轉換

下面的是一個合法的Java程序嗎?如果是,它會打印出什麽呢?


\u0070\u0075\u0062\u006c\u0069\u0063\u0020\u0020\u0020\u0020

\u0063\u006c\u0061\u0073\u0073\u0020\u0055\u0067\u006c\u0079

\u007b\u0070\u0075\u0062\u006c\u0069\u0063\u0020\u0020\u0020

\u0020\u0020\u0020\u0020\u0073\u0074\u0061\u0074\u0069\u0063

\u0076\u006f\u0069\u0064\u0020\u006d\u0061\u0069\u006e\u0028

\u0053\u0074\u0072\u0069\u006e\u0067\u005b\u005d\u0020\u0020

\u0020\u0020\u0020\u0020\u0061\u0072\u0067\u0073\u0029\u007b

\u0053\u0079\u0073\u0074\u0065\u006d\u002e\u006f\u0075\u0074

\u002e\u0070\u0072\u0069\u006e\u0074\u006c\u006e\u0028\u0020

\u0022\u0048\u0065\u006c\u006c\u006f\u0020\u0077\u0022\u002b

\u0022\u006f\u0072\u006c\u0064\u0022\u0029\u003b\u007d\u007d

這當然是一個合法的Java程序!這不是很顯而易見嗎?它會打印Hello World。噢,可能是不那麽明顯。事實上,該程序根本讓人無法理解。每當你沒必要地使用了一個Unicode轉義字符時,都會使你的程序的可理解性更缺失一點,而該程序將這種做法發揮到了極致。如果你很好奇,可以看看下面給出的該程序在Unicode轉義字符都被轉換為它們所表示的字符之後的樣子:


public 

class Ugly

{public

static

void main(

String[]

args){

System.out

.println(

“Hello w”+

“orld”);}}

下面給出了將其進行格式化整理之後的樣子:


public class Ugly {

  public static void main(String[] args){

     System.out.println("Hello w"+"orld");

  }

}

這個謎題的教訓是:僅僅是因為你可以不以應有的方式去進行表達。或者說,如果你這麽做會造成損害,那麽就請不要這麽做!更嚴肅地講,這個謎題是對前面三個教訓的補充:Unicode轉義字符只有在你要向程序中插入用其他任何方式都無法表示的字符時才是必需的,除此之外的任何情況都不應該避免使用它們。Unicode轉義字符降低了程序的清晰度,並且增加了產生bug的可能性。

對語言的設計者來說,也許使用Unicode轉義字符來表示ASCII字符應該被定義為是非法的。這樣就可以使得在謎題14、15和17(本謎題)中的程序非法,從而消除了大量的混亂。這個限制對程序員並不會造成任何困難。

謎題17:嗯?