我需要编写一个单线程程序,打印出程序的参数,而不使用除argc之外的任何其他计数器变量。但是:Oneliner C打印参数
问题1.它以降序而不是升序打印参数。
问题2:gcc和cl产生不同的结果,所以哪一个是对的?
while(argc>0) printf("Argument %d is %s\n",--argc,argv[argc]);
我需要编写一个单线程程序,打印出程序的参数,而不使用除argc之外的任何其他计数器变量。但是:Oneliner C打印参数
问题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]
与%s
时,它会导致未定义的行为。另一个是没有插入序列点的argc
的修改。
没有错。未定义的行为是不对的。
@将不要编辑,写你自己的答案。 – 2013-02-25 13:15:56
未定义的行为既不正确也不正确,只是未定义。调用未定义行为的代码永远不可移植,并且很少没有bug。 – 2013-02-25 13:21:15
@PascalCuoq谢谢,我只是懒惰。 – Will 2013-02-25 13:24:11
搬出argc
值从printf
改变,否则Undefined Behaviour
occours。
while((argc--)>0) printf("Argument %d is %s\n",argc,argv[argc]);
问题是因为:
的函数参数的计算顺序是不确定的
不要写程序这种方式有不能保证该参数将首先被执行。
根据C++标准5.2.2/8:
前的功能后缀表达式和参数表达式的评估都是相对于彼此未测序。进入
无论是--argc
或argv[argc]
将excuted第一和行为是不确定的说法表达评价所有副作用测序。
买一个拼图 - 或wasgij? – 2013-02-25 13:12:31
这是可能的。在C程序中不需要换行符。任何长度的C程序都可以放在一行中,并且仍然有效。 ** EXCEPT **预处理器的东西不能放在一行上;每个预处理器语句都需要它自己的行。 – BenjiWiebe 2013-02-25 13:15:28
C中的“行”不是强制性的(除了一些预处理用途)。您可以在单个长行中编写一个程序(不使用'#include')。 – pmg 2013-02-25 13:16:11