我有一个人为的例子来演示特定功能的请求 - 我想知道是否有人有一个聪明的技巧来做到这一点。
以下是人们经常遇到的问题:
“打印一系列数字;在它们之间打印一个空格,最后一个回车(但没有空格)。
显而易见的解决方案是将最后一个(或第一个)语句作为特例。我正在考虑如何使这更有效/更紧凑。
蛮力:
for(ii=0; ii<4; ii++) {
printf("%d", ii);
if(ii<3) printf(" "); else printf("\n");
}
请注意,这涉及两个条件评估。
展开:
for(ii=0; ii<3; ii++) {
printf("%d ", ii):
}
printf("%d\n", ii);
利用以下事实:当我们离开循环时,ii
将最后一次递增。
我想要的功能
ii = 0;
while(1) {
printf("%d", ii);
ii++;
if(ii<3) printf(" ");
else {printf("\n"); break;}
}
我想知道是否可以在for
声明中完成这项工作。我修改了一下,发现以下工作(有点令我惊讶......它确实需要括号,而且?:
和,
运算符之间完全不可读 - 请参阅{{3} }):
for(ii=0; (ii<3)?(printf("%d ",ii),1):(printf("%d\n",ii),0);ii++);
我基本上将for循环的evaluate this condition
部分转换为execute this statement for most of the loop, and this other one for the last pass
语句。
我想知道是否有更好的方法来做到这一点 - 既高效又可读?
答案 0 :(得分:2)
[在很多方面,这个问题应该根据其意见而结束。]
这个问题经常出现。我总是选择最小化迭代部分中的指令的解决方案。
{ /*don't pollute the outer scope with ii*/
int ii;
for (ii = 0; ii < 3; ++ii/*I've always preferred this to ii++*/) {
printf("%d ", ii);
}
printf("%d\n", ii);
}
三元,if
语句等。只是混淆了一些事情。在我看来。
答案 1 :(得分:1)
“蛮力”和三元条件解决方案具有相同的复杂性,但第二个不太“可读”。
你可以做一个简单的方法打印:
void print() {
int i = 0;
for(i=0; i != size - 1; ++i) {
printf("%i ",i);
}
printf("%i\n", i);
}
我认为它也很有效率和可读性 通过这种方式,您可以减少cyclomatic complexity的alghotitm。
答案 2 :(得分:1)
我在这种情况下使用了以下类型的构造。它不是更有效(在每次迭代时仍然有条件),但我喜欢它,因为它产生一个printf
:
char *sep = " ";
for(ii=0; ii<4; ii++) {
if ( ii == 3 )
sep = "\n";
printf( "%d%s", ii, sep );
}
答案 3 :(得分:1)
对于可读性和性能,我认为可以使用以下代码:
for (ii = 0;; ii++)
{
printf("%d", ii);
(ii < 3) ? (putchar(' ')) : ({ putchar('\n'); break; });
}
实际上,上面的代码与您上一个代码类似。它是可读的,并且在每个增量中仍然有一个条件评估。
答案 4 :(得分:0)
int numberoftimes = 4
if numberoftimes > 1
{
for(ii=0; ii<numberoftimes - 1; ii++)
{
printf("%d ", ii);
}
}
printf("%d\n", numberoftimes - 1);
您可以在循环中每次测试,也可以先测试一次......
答案 5 :(得分:0)
这是一种需要单独初始化传递的方法,但它有一个稍微清晰的for
循环。数组sepsarray
包含您想要的分隔符(在此示例中为逗号,以便您可以看到它们)。 sepsarray
的最后一个元素后跟一个终止循环的'\0'
。
#include <stdio.h>
#define MAXNUM 5
//print up to this
void main() {
char sepsarray[256] = {0}; //256=arbitrary max size
int i;
char *seps=sepsarray;
for(i=0;i<MAXNUM;++i) sepsarray[i]=','; //fill in the separators
sepsarray[i]='\n'; //the last separator
for(i=0; printf("%d%c",i,*seps++),*seps; i++) /* pretend to do nothing */ ;
}
输出:
0,1,2,3,4,5
几乎没有IOCCC材料,但是嘿......:)