题
我目前通过在“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上学期谁做。