argc以外の他のカウンター変数を使用せずに、プログラムの引数を出力する1つのライナープログラムを作成する必要があります。でも:
問題1.引数を昇順ではなく、降順で出力します。
問題2.gccとclは異なる結果を生成しますが、どちらが正しいですか?
while(argc>0) printf("Argument %d is %s\n",--argc,argv[argc]);
argc以外の他のカウンター変数を使用せずに、プログラムの引数を出力する1つのライナープログラムを作成する必要があります。でも:
問題1.引数を昇順ではなく、降順で出力します。
問題2.gccとclは異なる結果を生成しますが、どちらが正しいですか?
while(argc>0) printf("Argument %d is %s\n",--argc,argv[argc]);
あなたがワンライナーを探しているなら、これは助けなしでやってくれますargc
:
while(*argv) printf("Argument is %s\n",*argv++);
argv[argc]
NULLであることが保証されています。
これもコードの問題です。で渡すargv[argc]
と%s
、未定義の動作が発生します。もう1つはargc
、介在するシーケンスポイントなしでの変更です。
どれも正しくありません。未定義動作は決して正しくありません。
それ以外argc
の場合は値の変更を移動します。printf
Undefined Behaviour
while((argc--)>0) printf("Argument %d is %s\n",argc,argv[argc]);
問題は次の理由によるものです。
関数の引数の評価順序は指定されていません
どの引数が最初に実行されるかは保証されないため、この方法でプログラムを作成しないでください。
C++標準5.2.2/8によると:
接尾辞式と引数式の評価はすべて、相互に順序付けられていません。引数式の評価のすべての副作用は、関数が入力される前に順序付けられます
またはが最初に実行され、動作は定義されていません--argc
。argv[argc]