0

我需要编写一个单行程序来打印程序的参数,而不使用除 argc 之外的任何其他计数器变量。然而:

问题 1. 它以降序而不是升序打印参数。

问题2. gcc 和 cl 产生不同的结果,那么哪个是正确的?

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

4 回答 4

5

如果您正在寻找 oneliner 那么这将在没有以下帮助的情况下完成argc

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

argv[argc]保证为NULL。

这也是您的代码中的一个问题。当您通过argv[argc]with 时%s,它会导致未定义的行为。另一个是argc没有中间序列点的修改。

于 2013-02-25T13:22:19.083 回答
3

没有一个是对的。未定义的行为永远不会正确。

于 2013-02-25T13:11:47.360 回答
3

永远不要以这种方式编写程序,因为无法保证首先执行哪个参数。

根据 C++ 标准 5.2.2/8:

后缀表达式和参数表达式的求值都是无序的。参数表达式评估的所有副作用在输入函数之前排序

要么 要么--argcargv[argc]首先执行,并且行为未定义。

于 2013-02-25T13:19:29.607 回答
3

移出否则发生的argc值变化。printfUndefined Behaviour

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

问题是因为:

未指定函数参数的评估顺序

于 2013-02-25T13:16:44.170 回答