2013-02-25 51 views
0

我需要編寫一個單線程程序,打印出程序的參數,而不使用除argc之外的任何其他計數器變量。但是:Oneliner C打印參數

問題1.它以降序而不是升序打印參數。

問題2:gcc和cl產生不同的結果,所以哪一個是對的?

while(argc>0) printf("Argument %d is %s\n",--argc,argv[argc]); 
+0

買一個拼圖 - 或wasgij? – 2013-02-25 13:12:31

+0

這是可能的。在C程序中不需要換行符。任何長度的C程序都可以放在一行中,並且仍然有效。 ** EXCEPT **預處理器的東西不能放在一行上;每個預處理器語句都需要它自己的行。 – BenjiWiebe 2013-02-25 13:15:28

+0

C中的「行」不是強制性的(除了一些預處理用途)。您可以在單個長行中編寫一個程序(不使用'#include')。 – pmg 2013-02-25 13:16:11

回答

5

如果你正在尋找一個oneliner那麼這將離不開的argc幫助:

while(*argv) printf("Argument is %s\n",*argv++); 

argv[argc]保證是NULL。

這也是你的代碼中的一個問題。當您通過argv[argc]%s時,它會導致未定義的行爲。另一個是沒有插入序列點的argc的修改。

3

沒有錯。未定義的行爲是不對的。

+0

@將不要編輯,寫你自己的答案。 – 2013-02-25 13:15:56

+2

未定義的行爲既不正確也不正確,只是未定義。調用未定義行爲的代碼永遠不可移植,並且很少沒有bug。 – 2013-02-25 13:21:15

+0

@PascalCuoq謝謝,我只是懶惰。 – Will 2013-02-25 13:24:11

3

搬出argc值從printf改變,否則Undefined Behaviour occours。

while((argc--)>0) printf("Argument %d is %s\n",argc,argv[argc]); 

問題是因爲:

的函數參數的計算順序是不確定的

3

不要寫程序這種方式有不能保證該參數將首先被執行。

根據C++標準5.2.2/8:

後綴表達式和參數表達式的評估都是相對於彼此未測序。進入

前的功能

無論是--argcargv[argc]將excuted第一和行爲是不確定的說法表達評價所有副作用測序。