学校C语言课的PPT,关于 Command line arguments的,讲的很粗,例题直接看不懂。直接上图片了,因为有老师的标注,截图比较完整。我的疑问在于,1.虚线框内的代码有什么作用,老师说为了避免String = NULL?并不理解。2.为什么用fprintf并且括号内是stderr?如果没有特殊作用,那我就理解为老师只是为了演示课堂内容了……3.这里为什么exit()和return混用,各有什么目的?
新入门,求助各位前辈,谢谢!
附上图的原题:
人生最曼妙的风景,竟是内心的淡定与从容!
原本不打算回答的,但看了樓上vczh的回答,我不太贊同,所以還是發表一下自己的看法吧,如有錯誤敬請指出。
vczh
因為這段程式需要傳入2個參數,後面的2個if语句就是用來讀取這2個參數的。而所有程式在執行時第一個參數都是程式本身的執行檔的名稱,所以為了確保程式傳入了2個參數,就需要判斷argc的值是否等於3。如果不事先判斷,後面的2個if語句中就可能會讀取到錯誤的資料(也就是vczh所說的野指標資料)
if语句
argc
將普通資訊和錯誤訊息分別輸出到「標準輸出」和「錯誤輸出」中,是一種良好的習慣,這樣使用者就可以方便地區分正常輸出和錯誤輸出,例如把兩者重新導向到不同的日誌檔案
對於只有一個執行緒的程序,在main中使用exit和return的效果是一樣的,都是結束程序。但如果不是在main函數中,或是程式開了多個線程,那麼return就無法達到退出程式的目的了。所以退出程序使用exit是一種好的習慣。第一,它看起來清晰,exit一眼就知道是用來退出的;第二,它可以保證在任何情況下都能正確退出程序,例如我前面所說的開啟了多線程或當前不在main函數中的情況。
exit
return
最後一點是我和vczh觀點最大的不同。我認為,當你的意圖是主動、並且是確定地要退出程序時,就用exit,不要用return,其他情況,用return。
我認為你老師的這個程式寫的很好,最後一句之所以用return,是因為程式已經執行到最後,main方法是時候「返回」了,這句程式碼的意圖更強調的是main方法正常结束了,而不是我要在这里退出程序,所以這裡用的是return(正常返回),而不是exit(強調的是我要让程序退出)——雖然2者在效果上是一樣的。
main方法正常结束了
我要在这里退出程序
我要让程序退出
以下答案摘自:請問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為正常推出,其它數字為異常,其對應的錯誤可以自己指定。
1.虛線框內的程式碼有什麼作用,老師說為了避免String = NULL?並不理解。
就是檢查命令列輸入。其實不是String = NULL,而是你從argv裡面會讀到野指標。
2.為什麼用fprintf並且括號內是stderr?如果沒有特殊作用,那我就理解為老師只是為了演示課堂內容了……
stderr是用來輸出錯誤訊息的。當別的程式啟動你的程序,然後讀你的輸出,而且不顯示在螢幕上的時候,有點用。其實這是個早期的跨程式交換資料的方法,早已過時。
3.這裡為什麼exit()和return混用,各有什麼目的?
從實務來看,return也可以。 exit是一種粗暴的結束進程的方法,不建議使用。
原本不打算回答的,但看了樓上
vczh
的回答,我不太贊同,所以還是發表一下自己的看法吧,如有錯誤敬請指出。因為這段程式需要傳入2個參數,後面的2個
if语句
就是用來讀取這2個參數的。而所有程式在執行時第一個參數都是程式本身的執行檔的名稱,所以為了確保程式傳入了2個參數,就需要判斷argc
的值是否等於3。如果不事先判斷,後面的2個if語句中就可能會讀取到錯誤的資料(也就是vczh
所說的野指標資料)將普通資訊和錯誤訊息分別輸出到「標準輸出」和「錯誤輸出」中,是一種良好的習慣,這樣使用者就可以方便地區分正常輸出和錯誤輸出,例如把兩者重新導向到不同的日誌檔案
對於只有一個執行緒的程序,在main中使用
exit
和return
的效果是一樣的,都是結束程序。但如果不是在main函數中,或是程式開了多個線程,那麼return
就無法達到退出程式的目的了。所以退出程序使用exit
是一種好的習慣。第一,它看起來清晰,exit
一眼就知道是用來退出的;第二,它可以保證在任何情況下都能正確退出程序,例如我前面所說的開啟了多線程或當前不在main函數中的情況。最後一點是我和
vczh
觀點最大的不同。我認為,當你的意圖是主動、並且是確定地要退出程序時,就用exit
,不要用return
,其他情況,用return
。我認為你老師的這個程式寫的很好,最後一句之所以用
return
,是因為程式已經執行到最後,main方法是時候「返回」了,這句程式碼的意圖更強調的是main方法正常结束了
,而不是我要在这里退出程序
,所以這裡用的是return
(正常返回),而不是exit
(強調的是我要让程序退出
)——雖然2者在效果上是一樣的。以下答案摘自:
請問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為正常推出,其它數字為異常,其對應的錯誤可以自己指定。
就是檢查命令列輸入。其實不是String = NULL,而是你從argv裡面會讀到野指標。
stderr是用來輸出錯誤訊息的。當別的程式啟動你的程序,然後讀你的輸出,而且不顯示在螢幕上的時候,有點用。其實這是個早期的跨程式交換資料的方法,早已過時。
從實務來看,return也可以。 exit是一種粗暴的結束進程的方法,不建議使用。