我目前通过在“C编程语言”的excercises工作。这里是我的解决方案之一:

int c;

while ((c=getchar()) != EOF) {

if (c == ' ') {

    while ((c = getchar()) == ' ')

    {}  // do nothing?

    putchar(' ');

}

putchar(c);

}

我找到了一些解决方案,这里那些对我的完全不同,使用一个额外的变量来跟踪这是怎么回事的,而我只是用了一段遍历所有空格跳跃。我的解决方案感觉有点乱,因为它似乎有点hackish有与花括号之间没有while循环。我想知道是否有什么好的理由不这样做呢?感谢:-)任何建议

有帮助吗?

解决方案

根本不变化 - 我相信,因为它可以让你会发现什么也不做循环像这样在K&R,所以这是我们所官方

这是个人喜好的问题,但我更喜欢我什么都不做的循环是这样的:

while(something());

其他人则倾向于分号去一个单独的行,以加强事实,这是一个循环:

while(something())
  ;

还有一些人喜欢使用什么也没有括号内,因为你做了:

while(something())
{
}

这都是有效的 - 你只需要选择你喜欢的风格,并坚持下去。

其他提示

您的问题“是使用而块什么都不做坏事?”也可以在浪费CPU周期方面答复。在此情况下,答案是“否”,因为,该过程将在等待用户输入睡觉的字符。

的方法,将唤醒仅之后的字符被输入。然后测试将发生,如果测试通过,即ç==“”,过程中会,直到进入下一个字符再次进入睡眠状态。这重复进行,直到被输入一个非空格字符。

我认为这是完全可以接受的。

我要么写:

//skip all spaces
while ((c = getchar()) == ' ') {} 

,使之明显的是这个代码的一行做一件事情。

或者我会写这样的:

while ((c = getchar()) == ' ') {
    //no processing required for spaces
}

,使之与代码的格式的其他部分相匹配。

就个人而言,我不是的一个风扇

while ((c = getchar()) == ' ');

格式。我认为这是容易忽略的分号。

那么,如果你真的不喜欢空括号,你可以重构该内环成

while (c == ' ') {c = getchar();}

这虽然花费一个额外的比较,因此do while循环会更好。

我不认为这个程序是,但您的格式是很奇怪的。有没有错:

/* Eat spaces */
while ((c = getchar()) == ' ');

(即,表示有故意不体)

我将有利于:

while ((c = getchar()) == ' ') /* Eat spaces */;

我也一直知道有一个名为DoNothing程序专门为调用这样的情况下。这使得它很清楚,你真的是什么都不做。

虽然不存在的环体是完全可以接受的,应该 VERY 清楚的是这是有意的。

这是什么都不做可能是while的坏事:

while(!ready) {
   /* Wait for some other thread to set ready */
}

...是真的,真的,昂贵的方式等待 - 它会使用CPU的操作系统将会给它,只要ready是假的,占用CPU时间与其他线程可能是做有用功。

不过你的循环是不会无所事事:

while ((c = getchar()) == ' ')
    {};  // skip

...因为它呼吁每个迭代getchar()。因此,当其他人都同意,你所做的事是好的。

我已经用这样的代码。我不认为有任何真正的理由不,如果情况需要使用它。

我认为这没有问题。您可以使用它,在许多情况下,我喜欢它。

在规范的方法 - 自古以来使用的,一看,例如,在书里昂 - 是

while(condition)       // Here's the whole thing
    ;                  // empty body.

在实际上,在一般的惯例,“在单独的行semicolor”用于一个空语句。您会,例如,偶尔见

if( condition-1)
     ;
else if (condition-2)
     stmt;
else {
     // do stuff here
}

这是一个很大很罕见的,但显示了一方位置的条件1 的是非常复杂的,所以你不想否定它和机会的混乱,或者代码已经手工优化其生活的一英寸之内,所以你首先要最常见的情况。

while(condition) ;

形式要避免盲目,因为这是一个共同的和恼人的错字:你应该说清楚,你是故意的。空括号

 while(condition){
 }

或其变体,也麻烦,因为他们要么不坚持足够长,或更糟糕的铅与其他错别字。

好了,不是真的,但它取决于你的架构。

if (dosomething()) { ; }

上面的是要不断地推动,并从本地堆,其具有存储器开销弹出。此外,您也将与空操作,操作冲洗你的处理器的管道。

其中尚未提及的一个备选方案:

while(condition)
    (void)0;

我真的不喜欢写我的循环这样的,但我有一个TA上学期谁做。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top