搜尋

首頁  >  問答  >  主體

c++ - 一段代码,这里为什么用exit(1)而不是return 1?还有如何解读这种避免String = NULL的方式?

学校C语言课的PPT,关于 Command line arguments的,讲的很粗,例题直接看不懂。
直接上图片了,因为有老师的标注,截图比较完整。
我的疑问在于,
1.虚线框内的代码有什么作用,老师说为了避免String = NULL?并不理解。
2.为什么用fprintf并且括号内是stderr?如果没有特殊作用,那我就理解为老师只是为了演示课堂内容了……
3.这里为什么exit()和return混用,各有什么目的?

新入门,求助各位前辈,谢谢!

附上图的原题:

黄舟黄舟2803 天前735

全部回覆(3)我來回復

  • 天蓬老师

    天蓬老师2017-04-17 13:11:50

    原本不打算回答的,但看了樓上vczh的回答,我不太贊同,所以還是發表一下自己的看法吧,如有錯誤敬請指出。

    1. 因為這段程式需要傳入2個參數,後面的2個if语句就是用來讀取這2個參數的。而所有程式在執行時第一個參數都是程式本身的執行檔的名稱,所以為了確保程式傳入了2個參數,就需要判斷argc的值是否等於3。如果不事先判斷,後面的2個if語句中就可能會讀取到錯誤的資料(也就是vczh所說的野指標資料)

    2. 將普通資訊和錯誤訊息分別輸出到「標準輸出」和「錯誤輸出」中,是一種良好的習慣,這樣使用者就可以方便地區分正常輸出和錯誤輸出,例如把兩者重新導向到不同的日誌檔案

    3. 對於只有一個執行緒的程序,在main中使用exitreturn的效果是一樣的,都是結束程序。但如果不是在main函數中,或是程式開了多個線程,那麼return就無法達到退出程式的目的了。所以退出程序使用exit是一種好的習慣。第一,它看起來清晰,exit一眼就知道是用來退出的;第二,它可以保證在任何情況下都能正確退出程序,例如我前面所說的開啟了多線程或當前不在main函數中的情況。

    最後一點是我和vczh觀點最大的不同。我認為,當你的意圖是主動、並且是確定地要退出程序時,就用exit,不要用return,其他情況,用return

    我認為你老師的這個程式寫的很好,最後一句之所以用return,是因為程式已經執行到最後,main方法是時候「返回」了,這句程式碼的意圖更強調的是main方法正常结束了,而不是我要在这里退出程序,所以這裡用的是return(正常返回),而不是exit(強調的是我要让程序退出)——雖然2者在效果上是一樣的。

    回覆
    0
  • ringa_lee

    ringa_lee2017-04-17 13:11:50

    以下答案摘自:
    請問return與exit的差別?謝謝

    return與exit的差別是什麼?

    exit()是一個函數
    ,結束一個進程,它將刪除進程使用的記憶體空間,同時把錯誤訊息傳回父進程,在父進程中wait系統呼叫將接受到此回傳訊息。

    return回傳函數值,是關鍵字

    在main函數中我們通常會使用return (0);這樣的方式傳回一個值。

    但這是限定在非void情況下的也就是void main()這樣的形式。

    exit()通常是用在子程式中用來終結程式用的,使用後程式自動結束跳會作業系統。

    但如果把exit用在main內的時候無論main是否定義成void回傳的值都是有效的,並且exit不需要考慮型,exit(1)等價於return (1)

    exit(0); //正常退出
    非0即是非正常退出
    數字0,1,-1會被寫入環境變數ERRORLEVEL,其它程式可以由此判斷程式結束狀態。
    一般0為正常推出,其它數字為異常,其對應的錯誤可以自己指定。

    回覆
    0
  • 天蓬老师

    天蓬老师2017-04-17 13:11:50

    1.虛線框內的程式碼有什麼作用,老師說為了避免String = NULL?並不理解。

    就是檢查命令列輸入。其實不是String = NULL,而是你從argv裡面會讀到野指標。

    2.為什麼用fprintf並且括號內是stderr?如果沒有特殊作用,那我就理解為老師只是為了演示課堂內容了……

    stderr是用來輸出錯誤訊息的。當別的程式啟動你的程序,然後讀你的輸出,而且不顯示在螢幕上的時候,有點用。其實這是個早期的跨程式交換資料的方法,早已過時。

    3.這裡為什麼exit()和return混用,各有什麼目的?

    從實務來看,return也可以。 exit是一種粗暴的結束進程的方法,不建議使用。

    回覆
    0
  • 取消回覆