亚洲免费乱码视频,日韩 欧美 国产 动漫 一区,97在线观看免费视频播国产,中文字幕亚洲图片

      1. <legend id="ppnor"></legend>

      2. 
        
        <sup id="ppnor"><input id="ppnor"></input></sup>
        <s id="ppnor"></s>

        JAVA字符謎題4:轉(zhuǎn)義字符的潰敗

        字號(hào):

        下面的程序使用了兩個(gè)Unicode的轉(zhuǎn)義字符,它們是用其十六進(jìn)制代碼來表示Unicode字符。那么,這個(gè)程序會(huì)打印什么呢?
            public class EscapeRout{
             public static void main(String[] args){
             // \u0022 是雙引號(hào)的Unicode轉(zhuǎn)義字符
             System.out.println("a\u0022.length()
            +\u0022b".length());
             }
            }
             對(duì)該程序的一種很膚淺的分析會(huì)認(rèn)為它應(yīng)該打印出26,因?yàn)樵谟蓛蓚€(gè)雙引號(hào)"a\u0022.length()+\u0022b"標(biāo)識(shí)的字符串之間總共有26個(gè)字符。
             稍微深入一點(diǎn)的分析會(huì)認(rèn)為該程序應(yīng)該打印16,因?yàn)閮蓚€(gè)Unicode轉(zhuǎn)義字符每一個(gè)在源文件中都需要用6個(gè)字符來表示,但是它們只表示字符串中的一個(gè)字符。因此這個(gè)字符串應(yīng)該比它的外表看其來要短10個(gè)字符。 如果你運(yùn)行這個(gè)程序,就會(huì)發(fā)現(xiàn)事情遠(yuǎn)不是這么回事。它打印的既不是26也不是16,而是2。
            理解這個(gè)謎題的關(guān)鍵是要知道:Java對(duì)在字符串字面常量中的Unicode轉(zhuǎn)義字符沒有提供任何特殊處理。編譯器在將程序解析成各種符號(hào)之前,先將Unicode轉(zhuǎn)義字符轉(zhuǎn)換成為它們所表示的字符[JLS 3.2]。因此,程序中的第一個(gè)Unicode轉(zhuǎn)義字符將作為一個(gè)單字符字符串字面常量("a")的結(jié)束引號(hào),而第二個(gè)Unicode轉(zhuǎn)義字符將作為另一個(gè)單字符字符串字面常量("b")的開始引號(hào)。程序打印的是表達(dá)式"a".length()+"b".length(),即2。
            如果該程序的作者確實(shí)希望得到這種行為,那么下面的語句將要清楚得多:
            System.out.println("a".length()+"b".length());
             更有可能的情況是該作者希望將兩個(gè)雙引號(hào)字符置于字符串字面常量的內(nèi)部。使用Unicode轉(zhuǎn)義字符你是不能實(shí)現(xiàn)這一點(diǎn)的,但是你可以使用轉(zhuǎn)義字符序列來實(shí)現(xiàn)[JLS 3.10.6]。表示一個(gè)雙引號(hào)的轉(zhuǎn)義字符序列是一個(gè)反斜杠后面緊跟著一個(gè)雙引號(hào)(\”)。如果將最初的程序中的Unicode轉(zhuǎn)義字符用轉(zhuǎn)義字符序列來替換,那么它將打印出所期望的16:
            System.out.println("a\".length()+\"b".length());
             許多字符都有相應(yīng)的轉(zhuǎn)義字符序列,包括單引號(hào)(\’)、換行(\n)、制表符(\t)和反斜線(\\)。你可以在字符字面常量和字符串字面常量中使用轉(zhuǎn)義字符序列。
            實(shí)際上,你可以通過使用被稱為八進(jìn)制轉(zhuǎn)義字符的特殊類型的轉(zhuǎn)義字符序列,將任何ASCII字符置于一個(gè)字符串字面常量或一個(gè)字符字面常量中,但是是盡可能地使用普通的轉(zhuǎn)義字符序列。
            普通的轉(zhuǎn)義字符序列和八進(jìn)制轉(zhuǎn)義字符都比Unicode轉(zhuǎn)義字符要好得多,因?yàn)榕cUnicode轉(zhuǎn)義字符不同,轉(zhuǎn)義字符序列是在程序被解析為各種符號(hào)之后被處理的。
            ASCII是字符集的最小公共特性集,它只有128個(gè)字符,但是Unicode有超過65,000個(gè)字符。一個(gè)Unicode轉(zhuǎn)義字符可以被用來在只使用ASCII字符的程序中插入一個(gè)Unicode字符。一個(gè)Unicode轉(zhuǎn)義字符精確地等價(jià)于它所表示的字符。
             Unicode轉(zhuǎn)義字符被設(shè)計(jì)為用于在程序員需要插入一個(gè)不能用源文件字符集表示的字符的情況。它們主要用于將非ASCII字符置于標(biāo)識(shí)符、字符串字面常量、字符字面常量以及注釋中。偶爾地,Unicode轉(zhuǎn)義字符也被用來在看起來頗為相似的數(shù)個(gè)字符中明確地標(biāo)識(shí)其中的某一個(gè),從而增加程序的清晰度。
            總之,在字符串和字符字面常量中要優(yōu)先選擇的是轉(zhuǎn)義字符序列,而不是Unicode轉(zhuǎn)義字符。Unicode轉(zhuǎn)義字符可能會(huì)因?yàn)樗鼈冊(cè)诰幾g序列中被處理得過早而引起混亂。不要使用Unicode轉(zhuǎn)義字符來表示ASCII字符。在字符串和字符字面常量中,應(yīng)該使用轉(zhuǎn)義字符序列;對(duì)于除這些字面常量之外的情況,應(yīng)該直接將ASCII字符插入到源文件中。