2013-02-25 47 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第一和行为是不确定的说法表达评价所有副作用测序。