我需要編寫一個單線程程序,打印出程序的參數,而不使用除argc之外的任何其他計數器變量。但是:Oneliner C打印參數
問題1.它以降序而不是升序打印參數。
問題2:gcc和cl產生不同的結果,所以哪一個是對的?
while(argc>0) printf("Argument %d is %s\n",--argc,argv[argc]);
我需要編寫一個單線程程序,打印出程序的參數,而不使用除argc之外的任何其他計數器變量。但是:Oneliner C打印參數
問題1.它以降序而不是升序打印參數。
問題2:gcc和cl產生不同的結果,所以哪一個是對的?
while(argc>0) printf("Argument %d is %s\n",--argc,argv[argc]);
如果你正在尋找一個oneliner那麼這將離不開的argc
幫助:
while(*argv) printf("Argument is %s\n",*argv++);
argv[argc]
保證是NULL。
這也是你的代碼中的一個問題。當您通過argv[argc]
與%s
時,它會導致未定義的行爲。另一個是沒有插入序列點的argc
的修改。
沒有錯。未定義的行爲是不對的。
@將不要編輯,寫你自己的答案。 – 2013-02-25 13:15:56
未定義的行爲既不正確也不正確,只是未定義。調用未定義行爲的代碼永遠不可移植,並且很少沒有bug。 – 2013-02-25 13:21:15
@PascalCuoq謝謝,我只是懶惰。 – Will 2013-02-25 13:24:11
搬出argc
值從printf
改變,否則Undefined Behaviour
occours。
while((argc--)>0) printf("Argument %d is %s\n",argc,argv[argc]);
問題是因爲:
的函數參數的計算順序是不確定的
不要寫程序這種方式有不能保證該參數將首先被執行。
根據C++標準5.2.2/8:
前的功能後綴表達式和參數表達式的評估都是相對於彼此未測序。進入
無論是--argc
或argv[argc]
將excuted第一和行爲是不確定的說法表達評價所有副作用測序。
買一個拼圖 - 或wasgij? – 2013-02-25 13:12:31
這是可能的。在C程序中不需要換行符。任何長度的C程序都可以放在一行中,並且仍然有效。 ** EXCEPT **預處理器的東西不能放在一行上;每個預處理器語句都需要它自己的行。 – BenjiWiebe 2013-02-25 13:15:28
C中的「行」不是強制性的(除了一些預處理用途)。您可以在單個長行中編寫一個程序(不使用'#include')。 – pmg 2013-02-25 13:16:11