<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    早上看了java類庫(kù)中java.util.Arrays 類的toString方法的源代碼。如下:(這是JDK1.6的源代碼)
        public static String toString(long[] a) {
            
    if (a == null)
                
    return "null";
        
    int iMax = a.length - 1;
        
    if (iMax == -1)
                
    return "[]";

            StringBuilder b 
    = new StringBuilder();
            b.append(
    '[');
            
    for (int i = 0; ; i++) {
                b.append(a[i]);
            
    if (i == iMax)
            
    return b.append(']').toString();
                b.append(
    "");
            }
        }

    for循環(huán)有點(diǎn)奇怪,中間的那個(gè)表達(dá)式是空的。其實(shí)即使加上了條件,for (int i = 0; i<=iMax ; i++) 和源程序是一個(gè)效果的,純粹是多余的,但是我就是多余地加上了這條,結(jié)果編譯出錯(cuò)了!提示我沒有返回語句!

    我又重新編寫了兩個(gè)小程序來驗(yàn)證一下:
    下面這個(gè)能通過編譯:
    class Test{
        
    static String m(){
            
    int a =10;
            
    for (int i = 0; ; i++)
                
    if(i==a)
                    
    return "10";
        }
        
    public static void main (String[] args) {
            System.out.println (m());
        }
    }
    for循環(huán)的中間語句是空的。

    下面這個(gè)就不能編譯了:

    class Test{
        
    static String m(){
            
    int a =10;
            
    for (int i = 0; i<=a ; i++)
                
    if(i==a)
                    
    return "10";
        }
        
    public static void main (String[] args) {
            System.out.println (m());
        }
    }

    其實(shí)加上的語句并沒有改變?cè)瓉磉壿嫿Y(jié)構(gòu)。這是為什么呢?

    如果在for的外面加上一個(gè)return語句,隨便返回什么字符串,又能通過編譯了!!!這個(gè)字符串永遠(yuǎn)不能輸出的!!!根本就是個(gè)擺設(shè)!!!

    class Test{
        
    static String m(){
            
    int a =10;
            
    for (int i = 0; i<=a ; i++)
                
    if(i==a)
                    
    return "10";
            
    return "never be touch!!!";
        }
        
    public static void main (String[] args) {
            System.out.println (m());
        }
    }


    另外如果像下面這樣在for的中間表達(dá)式加上一個(gè)恒等式,又能通過編譯了!!!這是為什么呢?請(qǐng)高手指點(diǎn)!
    class Test{
        
    static String m(){
            
    int a =10;
            
    for (int i = 0true==true ; i++)
                
    if(i==a)
                    
    return "10";
        }
        
    public static void main (String[] args) {
            System.out.println (m());
        }
    }


    附:這是JDK1.5的源碼,謝謝GrayWolf!
    1.6的代碼到底比1.5的改進(jìn)在哪里呢?我覺得1.5版的實(shí)現(xiàn)比較清晰,可讀性好一點(diǎn)。
    #  public static String toString(long[] a) {
    if (a == null)
    return "null";
    if (a.length == 0)
    return "[]";
    #
    # StringBuilder buf 
    = new StringBuilder();
    # buf.append(
    '[');
    # buf.append(a[
    0]);
    #
    for (int i = 1; i < a.length; i++) {
    # buf.append(
    "");
    # buf.append(a[i]);
    # }
    #
    # buf.append(
    "]");
    return buf.toString();
    # }



    Feedback

    # re: 有關(guān)方法返回一個(gè)很奇怪的問題!  回復(fù)  更多評(píng)論   

    2007-11-01 19:12 by GrayWolf
    你的代碼有問題:
    http://www.javaresearch.org/source/index.html 這里有在線的源碼,就不用一個(gè)一個(gè)打上去了。哈哈。文章寫得還不錯(cuò)。哎,自愧不如,看來,下次學(xué)新技術(shù),我也得寫點(diǎn)東西出來了


    public static String toString(Object[] a) {
    if (a == null)
    return "null";
    if (a.length == 0)
    return "[]";

    StringBuilder buf = new StringBuilder();

    for (int i = 0; i < a.length; i++) {
    if (i == 0)
    buf.append('[');
    else
    buf.append(", ");

    buf.append(String.valueOf(a[i]));
    }

    buf.append("]");
    return buf.toString();
    }

    # re: 有關(guān)方法返回一個(gè)很奇怪的問題!  回復(fù)  更多評(píng)論   

    2007-11-01 19:18 by GrayWolf
    for循環(huán)有點(diǎn)奇怪,中間的那個(gè)表達(dá)式是空的。其實(shí)即使加上了條件,for (int i = 0; i<=iMax ; i++) 和源程序是一個(gè)效果的,純粹是多余的,但是我就是多余地加上了這條,結(jié)果編譯出錯(cuò)了!提示我沒有返回語句!
    =======================================
    這里,你加了 i<=iMax ,for循環(huán)做完后,i = iMax + 1,所以你的
    if (i == iMax)
    return b.append(']').toString();
    這句永遠(yuǎn)都不會(huì)執(zhí)行到,所以編譯器就提醒你了。
    ========================================
    你的源碼是不是有問題,我看的在線的,for循環(huán)中間是有條件的。

    # re: 有關(guān)方法返回一個(gè)很奇怪的問題!  回復(fù)  更多評(píng)論   

    2007-11-01 19:35 by Raylong
    @GrayWolf
    我上面那段代碼是JDK1.6的,你的那個(gè)在線代碼網(wǎng)站提供的是1.5的。

    # re: 有關(guān)方法返回一個(gè)很奇怪的問題!  回復(fù)  更多評(píng)論   

    2007-11-01 21:53 by zhrb
    @GrayWolf
    不是這樣的,因?yàn)槟愕膔eturn語句在for里面,如果for中間加入任何判斷條件,除非這個(gè)判斷條件絕對(duì)為真(如空語句、ture、3>2),否則就有可能沒法執(zhí)行到這個(gè)循環(huán)中的return語句,編譯器顯然不允許這種情況發(fā)生,所以當(dāng)return語句只在循環(huán)體內(nèi)出現(xiàn),就不允許for循環(huán)中間的那個(gè)語句出現(xiàn)類似i<a這樣的充滿不確定性的判斷。簡(jiǎn)單一句話,就是包含return的那個(gè)句子,至少要讓編譯器覺得,這個(gè)return是可以執(zhí)行到的,以減少出錯(cuò)的可能。
    不過即使這樣,還是架不住人們可能出現(xiàn)的語義上的錯(cuò)誤,看下面這段代碼:
    public static int max(int a, int b){
    for(;;)
    if (false) return a>b?a:b;
    }
    從語義上分析,return是無論如何也執(zhí)行不到的,但是編譯器看到for內(nèi)的語句肯定可以執(zhí)行,并且里面還有return語句,所以就想當(dāng)然的認(rèn)為沒錯(cuò)。至于到底有沒有錯(cuò),自己回去想想、試試一下就知道了。呵呵

    # re: 有關(guān)方法返回一個(gè)很奇怪的問題!  回復(fù)  更多評(píng)論   

    2007-11-01 22:24 by Raylong
    @zhrb
    原來如此啊!看來是我過分高估編譯器的智能了,編譯器能在一定程度上減少程序出錯(cuò)的可能。有時(shí)在一些細(xì)節(jié)上看起來比較笨拙……
    zhrb,謝謝非常詳細(xì)的解答!!!

    # re: 有關(guān)方法返回一個(gè)很奇怪的問題 - 問題已解決  回復(fù)  更多評(píng)論   

    2007-11-01 23:55 by zhrb
    @Raylong
    個(gè)人認(rèn)為編譯器這樣設(shè)計(jì)肯定有他的道理
    編譯器就應(yīng)該做他應(yīng)該做的事請(qǐng),涉及復(fù)雜的語義的東西還是交給程序員,自作聰明可能反而把事情搞得復(fù)雜起來.呵呵

    # re: 有關(guān)方法返回一個(gè)很奇怪的問題 - 問題已解決  回復(fù)  更多評(píng)論   

    2007-11-02 07:27 by Raylong
    static String m(){
    int a =10;
    for (int i = 0; i<=a ; i++)
    if(i==a)
    return "10";
    return "never be touch!!!";
    }

    是啊,我主要是覺得類似于上面的小程序,非要在最后加一個(gè)永遠(yuǎn)到達(dá)不了的return語句才能通過編譯,看起來很不爽 呵呵 雖然這個(gè)小程序很容易改寫。

    我宿舍有一個(gè)學(xué)C++的,他做個(gè)同樣的試驗(yàn),結(jié)果超級(jí)暈!比java存在的問題還難以解釋,看來我們java的編譯器還是比較聰明的,比較嚴(yán)格的(相對(duì)而言)

    # re: 有關(guān)方法返回一個(gè)很奇怪的問題 - 問題已解決  回復(fù)  更多評(píng)論   

    2007-11-02 09:06 by zhrb
    @Raylong
    我是覺得奇怪,為什么要這樣寫
    for (int i = 0; ; i++) {
    b.append(a[i]);
    if (i == iMax)
    return b.append(']').toString();
    b.append(", ");
    }
    為什么不寫成

    for (int i = 0;i<iMax ; i++) {
    b.append(a[i]);
    if (i < iMax - 1 ) b.append(", ");
    }
    return b.append(']').toString();

    我感覺這樣更直觀啊。呵呵
    不知道是不是出于效率上的考慮呢?

    # re: 有關(guān)方法返回一個(gè)很奇怪的問題 - 問題已解決  回復(fù)  更多評(píng)論   

    2007-11-02 10:24 by 翔南
    我一般重寫toString都是向樓上那么寫的
    for (int i = 0;i<iMax ; i++) {
    b.append(a[i]);
    if (i < iMax - 1 ) b.append(", ");
    }
    return b.append(']').toString();

    以后可以借鑒java源代碼的寫法,不過那樣寫怎么就效率高了?

    # re: 有關(guān)方法返回一個(gè)很奇怪的問題 - 問題已解決  回復(fù)  更多評(píng)論   

    2007-11-02 11:19 by 翔南
    for (int i = 0; ; i++) {
    b.append(a[i]);
    if (i == iMax)
    return b.append(']').toString();
    b.append(", ");
    }
    只因?yàn)閒or里面的if只有一次為真,只執(zhí)行一次if后的語句?

    # re: 有關(guān)方法返回一個(gè)很奇怪的問題 - 問題已解決  回復(fù)  更多評(píng)論   

    2007-11-02 11:26 by Raylong
    @zhrb
    是很奇怪,1.5版本的源碼也沒錯(cuò)啊,新的版本也沒體現(xiàn)出高超的地方吧。為什么要重寫呢?

    # re: 有關(guān)方法返回一個(gè)很奇怪的問題 - 問題已解決  回復(fù)  更多評(píng)論   

    2007-11-02 11:30 by Raylong
    @翔南
    有可能是!而且我覺得比較大小的效率沒有比較相等的效率高!
    從位模式來看,比較大小要看這個(gè)數(shù)的全部,而比較是否相等就不一樣了,只要看到第一個(gè)bit不一樣就認(rèn)定這兩個(gè)數(shù)不相等。
    不知道這么解釋對(duì)不對(duì) 呵呵
    如果是對(duì)的,那么細(xì)節(jié)就體現(xiàn)出水平了。

    # re: 有關(guān)方法返回一個(gè)很奇怪的問題 - 問題已解決  回復(fù)  更多評(píng)論   

    2007-11-02 20:49 by zhrb
    @Raylong
    事實(shí)上,如果用位模式來比較是否相等的話,只要對(duì)兩個(gè)數(shù)進(jìn)行異或就好了,最多一次就好了
    比較大小的話,可能比較麻煩吧( 還要考慮符號(hào)位,最少一次吧 )
    可能真的是這樣.呵呵

    # re: 有關(guān)方法返回一個(gè)很奇怪的問題 - 問題已解決  回復(fù)  更多評(píng)論   

    2009-05-25 18:42 by 卡不過
    方法
    主站蜘蛛池模板: 7x7x7x免费在线观看| 四虎国产精品免费永久在线| 日本视频一区在线观看免费| 国产亚洲精品资在线| 国产精品免费看久久久香蕉 | 成人黄软件网18免费下载成人黄18免费视频 | 亚洲成人中文字幕| 国产一区二区免费| 亚洲午夜免费视频| 国产v精品成人免费视频400条| 亚洲国产综合在线| 免费看大黄高清网站视频在线| 亚洲国产精品无码久久久秋霞1| 国产高清视频在线免费观看| 亚洲av无码专区在线电影天堂 | 亚洲一卡2卡3卡4卡5卡6卡| 四虎影视www四虎免费| 污污免费在线观看| 国产精品亚洲一区二区三区在线| 久久国产精品免费专区| 亚洲午夜久久久精品电影院| 日韩精品免费电影| 中文在线日本免费永久18近| 自怕偷自怕亚洲精品| 香蕉视频在线观看免费国产婷婷| 男女猛烈无遮掩视频免费软件| 亚洲AV日韩AV天堂一区二区三区| 免费99精品国产自在现线| 色婷婷亚洲一区二区三区| 亚洲动漫精品无码av天堂| 在线看片v免费观看视频777| 校园亚洲春色另类小说合集| 国产亚洲免费的视频看| 免费在线看v网址| 人成午夜免费大片在线观看| 久久久久亚洲AV无码专区首JN| 日韩免费无码一区二区视频| a级毛片在线免费观看| 亚洲一区二区无码偷拍| 亚洲国产精品va在线播放| 成年人免费网站在线观看|