我需要编写一个单行程序,打印出程序的参数,而不使用除argc之外的任何其他计数器变量。但是:
问题1.它按降序打印参数,而不是按升序打印。
问题2. gcc和cl产生不同的结果,哪一个是对的?
while(argc>0) printf("Argument %d is %s\n",--argc,argv[argc]);
答案 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:
后缀表达式和参数表达式的评估都是相对于彼此无法排序的。在输入函数之前,对参数表达式求值的所有副作用进行排序
首先执行--argc
或argv[argc]
并且行为未定义。