将复合语句放在for循环的条件中

时间:2013-12-06 15:54:13

标签: c for-loop

我有一个人为的例子来演示特定功能的请求 - 我想知道是否有人有一个聪明的技巧来做到这一点。

以下是人们经常遇到的问题:

“打印一系列数字;在它们之间打印一个空格,最后一个回车(但没有空格)。

显而易见的解决方案是将最后一个(或第一个)语句作为特例。我正在考虑如何使这更有效/更紧凑。

蛮力:

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语句。

我想知道是否有更好的方法来做到这一点 - 既高效又可读?

6 个答案:

答案 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材料,但是嘿......:)