84669 人學習
152542 人學習
20005 人學習
5487 人學習
7821 人學習
359900 人學習
3350 人學習
180660 人學習
48569 人學習
18603 人學習
40936 人學習
1549 人學習
1183 人學習
32909 人學習
学校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是一種粗暴的結束進程的方法,不建議使用。