我需要编写一个单行程序来打印程序的参数,而不使用除 argc 之外的任何其他计数器变量。然而:
问题 1. 它以降序而不是升序打印参数。
问题2. gcc 和 cl 产生不同的结果,那么哪个是正确的?
while(argc>0) printf("Argument %d is %s\n",--argc,argv[argc]);
我需要编写一个单行程序来打印程序的参数,而不使用除 argc 之外的任何其他计数器变量。然而:
问题 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]
with 时%s
,它会导致未定义的行为。另一个是argc
没有中间序列点的修改。
没有一个是对的。未定义的行为永远不会正确。
永远不要以这种方式编写程序,因为无法保证首先执行哪个参数。
根据 C++ 标准 5.2.2/8:
后缀表达式和参数表达式的求值都是无序的。参数表达式评估的所有副作用在输入函数之前排序
要么 要么--argc
将argv[argc]
首先执行,并且行为未定义。
移出否则发生的argc
值变化。printf
Undefined Behaviour
while((argc--)>0) printf("Argument %d is %s\n",argc,argv[argc]);
问题是因为:
未指定函数参数的评估顺序