Oneliner C打印参数

时间:2013-02-25 13:08:32

标签: c

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

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

问题2. gcc和cl产生不同的结果,哪一个是对的?

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

4 个答案:

答案 0 :(得分:5)

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

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

argv[argc]保证为NULL。

这也是您的代码中的问题。当您使用argv[argc]传递%s时,会导致未定义的行为。另一个是argc的修改而没有插入序列点。

答案 1 :(得分:3)

没有是对的。未定义的行为永远是对的。

答案 2 :(得分:3)

argc发出printf值更改,否则Undefined Behaviour成就。

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

问题是因为:

  

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

答案 3 :(得分:3)

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

根据C ++标准5.2.2 / 8:

  

后缀表达式和参数表达式的评估都是相对于彼此无法排序的。在输入函数之前,对参数表达式求值的所有副作用进行排序

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