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

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

以下是一个经常遇到的问题:

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

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

蛮力:

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在离开循环时最后一次增加的事实。

我想要的function

 ii = 0; while(1) { printf("%d", ii); ii++; if(ii<3) printf(" "); else {printf("\n"); break;} } 

我想知道是否有可能在for语句中使这项工作成功。 我修改了一下,发现以下工作(有点令我惊讶……它确实需要括号,而且?:和运算符之间完全不可读 – 请参阅http://codepad.org/wFa2YwCg ):

 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循环的execute this statement for most of the loop, and this other one for the last pass语句。

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

[在很多方面,这个问题应该根据其意见而结束。]

这个问题经常出现。 我总是选择最小化迭代部分中的指令的解决方案。

 { /*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陈述只是混淆了事情。 在我看来。

我已经为这种情况使用了以下类型的构造。 它效率不高(在每次迭代时仍然有条件),但我喜欢它,因为它会产生一个printf

 char *sep = " "; for(ii=0; ii<4; ii++) { if ( ii == 3 ) sep = "\n"; printf( "%d%s", ii, sep ); } 

“暴力”和三元条件解决方案具有相同的复杂性,但第二个不太“可读”。

你可以做一个简单的方法打印:

  void print() { int i = 0; for(i=0; i != size - 1; ++i) { printf("%i ",i); } printf("%i\n", i); } 

我认为它既有效又易读。
通过这种方式,您可以减少alghotitm的圈复杂度

对于可读性和性能,我认为可以使用以下代码:

 for (ii = 0;; ii++) { printf("%d", ii); (ii < 3) ? (putchar(' ')) : ({ putchar('\n'); break; }); } 

实际上,上面的代码与您上一个代码类似。 它是可读的,并且在每个增量中仍然有一个条件评估。

 int numberoftimes = 4 if numberoftimes > 1 { for(ii=0; ii 

您可以在循环中每次测试,也可以先测试一次......

这是一种需要单独初始化传递的方法,但是它具有稍微清晰的for循环。 数组sepsarray包含你想要的分隔符(在这个例子中,逗号,所以你可以看到它们)。 sepsarray的最后一个元素后跟一个终止循环的'\0'

 #include  #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 

输出:

 0,1,2,3,4,5 

几乎没有IOCCC材料,但是嘿...... 🙂