使用while块什么都不做坏事?

24 c while-loop

我目前正在学习'C程序设计语言'的练习.这是我的解决方案之一:

int c;

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

if (c == ' ') {

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

    {}  // do nothing?

    putchar(' ');

}

putchar(c);

}
Run Code Online (Sandbox Code Playgroud)

我在这里发现了一些与我的完全不同的解决方案,并使用额外的变量来跟踪发生了什么,而我只是使用while循环来跳过所有空间.我的解决方案感觉有点混乱,因为看起来有点hackish有一个在花括号之间没有任何东西的while循环.我想知道是否有任何好的理由不这样做?谢谢你的建议:-)

Kyl*_*nin 38

完全没有 - 我相信你会在K&R中找到像这样的无所事事的循环,所以它就像它的官方一样.

这是个人偏好的问题,但我更喜欢这样的无操作循环:

while(something());
Run Code Online (Sandbox Code Playgroud)

其他人更喜欢分号分开,以强化它是一个循环:

while(something())
  ;
Run Code Online (Sandbox Code Playgroud)

还有一些人更喜欢使用内部没有任何内容的括号,正如您所做的那样:

while(something())
{
}
Run Code Online (Sandbox Code Playgroud)

这一切都是有效的 - 你只需选择你喜欢的风格并坚持下去.

  • 我倾向于把"继续"放到一个空循环中:"while(foo)继续;".我认为这使得循环的无操作特性更清晰,但这是一个非常小的风格问题. (14认同)
  • 从没想过这一点。好主意 liw.fi! (2认同)
  • 在另一个帖子中,它指出 Google 风格指南正式推荐“{}”或“continue;”,因为单独的分号可能看起来像 do-while 循环的结尾。https://google-styleguide.googlecode.com/svn/trunk/cppguide.xml?showone=Loops_and_Switch_Statements#Loops_and_Switch_Statements (2认同)

jef*_*ffD 6

你的问题"使用一段时间不做任何坏事吗?" 也可以在浪费CPU周期方面回答.在这种情况下,答案是"否",因为,当进程等待用户输入字符时,进程将休眠.

只有在输入字符后才会唤醒该过程.然后测试将发生,如果测试通过,即c =='',则该过程将再次进入休眠状态,直到输入下一个字符.重复此操作直到输入非空格字符.


Cha*_*hon 5

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

我要么写:

//skip all spaces
while ((c = getchar()) == ' ') {} 
Run Code Online (Sandbox Code Playgroud)

使这一行代码做一件事很明显。

或者我会这样写:

while ((c = getchar()) == ' ') {
    //no processing required for spaces
}
Run Code Online (Sandbox Code Playgroud)

以便它与您的代码格式的其余部分相匹配。

就个人而言,我不喜欢

while ((c = getchar()) == ' ');
Run Code Online (Sandbox Code Playgroud)

格式。我认为很容易忽略分号。


Ceb*_*yre 5

好吧,如果你真的不喜欢空大括号,你可以将内部循环重构为

while (c == ' ') {c = getchar();}
Run Code Online (Sandbox Code Playgroud)

不过,这需要进行一次额外的比较,因此 do while 循环会更好。

  • 更好的可能是: do { c = getchar(); } while (c == ' '); 当然,除非在进入循环之前知道 c == ' '。 (2认同)