2017-06-22 29 views
1

我刚开始尝试学习C编程,并且我非常想知道它是如何工作的。在循环内部赋值的变量不起作用。为什么?

我想写一个程序来计算我按下ENTER,SPACE和TAB的次数。下面的代码工作:

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

    if(text == '\n') 
     ++newlines; 

    if(text == ' ') 
     ++blanks; 

    if(text == '\t') 
     ++tabs; 
} 

但是,下面的代码无法正常工作:

text = getchar(); 

while(text != EOF){ 

    if(text == '\n') 
     ++newlines; 

    if(text == ' ') 
     ++blanks; 

    if(text == '\t') 
     ++tabs; 
} 

我想知道为什么它工作时,我分配循环内的变量,而不是外面。

如果我将它指定到循环外并在控制台中运行程序,程序会在我按下ENTER后停止。

+0

在第二个文本永远不会改变或重新读取,所以你得到一个无限循环。 PS - 从不调用char变量“text”。 “文本”听起来像一个字符串变量或类似的。 – ebyrob

+0

你不要在上面的代码中声明ANYWHERE的任何变量。你所做的就是给变量赋值。第一个和第二个示例的区别在于,第一个示例中的“getchar”位于循环内部。第二个在外面。在第二个例子中,如果您只读取一个字符,然后一遍又一遍地循环该字符,会发生什么?它永远不会是EOF,因此将永远运行。 –

+0

感谢您的澄清,Sani!我编辑过它。 – Akitirija

回答

3

在第一种情况下,每次运行循环时都会得到一个新字符。每次到达循环结束时,循环都会重新检查该条件。在第二种情况下,您仍然每次都在检查,但价值并未发生变化 - 这与您刚开始时的价值相同。所以如果第一个字符不是EOF ......那么......你无限循环!

你可以通过再次迭代之前reupdating text解决第二种情况:

text = getchar(); 

while(text != EOF){ 

    if(text == '\n') 
     ++newlines; 

    if(text == ' ') 
     ++blanks; 

    if(text == '\t') 
     ++tabs; 

    text = getchar(); //added 
} 
+1

我试图想出一个很好的解释,其中包括条件“副作用”以及您在此解释的无增量迭代。但是......这很复杂。当'while(x ||(y = 1)== x)'出现时会发生什么,以及我们如何传达良好的风格通常会最小化“副作用编码”。 (即:不要从复制有问题的代码学习坏习惯) – ebyrob

+0

我认为这只是归结为解释在编程中有一席之地。 while循环内的条件不是分配的地方,总是有一种更可读和更安全的方式来实现相同的结果。千万不要试图用“编码高尔夫球”来解决问题,因为它使用较少的文字。 –

+0

我必须承认T运营商的某种嗜好,因为害怕腐蚀某人,所以我不会在这里完全命名。我可能会认为我的使用是好的,但可能没有可接受的用途。就像在循环或分支中跳过花括号一样糟糕。 PS - 你不能非常喜欢AJAX。 – ebyrob

相关问题