【发布时间】:2013-12-06 15:54:13
【问题描述】:
我有一个人为的例子来演示对特定功能的请求 - 我想知道是否有人有一个聪明的技巧来做到这一点。
以下是一个经常遇到的问题:
“打印一系列数字;在它们之间打印一个空格,并在末尾打印一个回车符(但没有空格)。
显而易见的解决方案是将最后一个(或第一个)语句作为特例。我正在考虑如何让这个更高效/更紧凑。
蛮力:
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 语句中进行这项工作。我稍微修改了一下,发现以下工作(令我惊讶的是......它确实需要括号,并且在 ?: 和 , 运算符之间非常难以阅读 - 请参阅 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 语句。
我想知道是否有更好的方法来做到这一点 - 既高效又可读?
【问题讨论】:
-
如果你只是展开它,为了说明打印的额外
ii,你可以这样做:for(ii=0; ii<2; ii++),所以它打印0 1 2而不是3。