与循环中的OR逻辑运算符混淆

时间:2014-12-15 05:04:18

标签: c++ operators computer-science

早在IRC频道上,有人问了一个关于他的代码的问题 - 基本上,他的程序是在一个无限循环上运行的:

#include <iostream>
using namespace std;

int main()
{
cout << "This program adds one to your input." << endl;

char choice = 'n';
int num = 0;

while (choice != 'y' || choice != 'Y')
{

    cout << "Enter number: ";

    cin >> num;
    num++;
    cout << "Your number plus 1 is: " << num << endl;
    cout << endl << "Continue/Quit? Type 'Y' to quit, any other key to continue: ";

    cin >> choice;
}

cout << "By choosing 'Y', you exit the loop." << endl;

return 0;

}

注意循环标题,似乎循环应该工作得很好,但是每当我需要输入Y或y才能退出时,循环会继续运行。考虑到如果左边的那个是真的,while循环将不会评估右边的表达式,这使得它特别令人困惑。但无论如何,即使我输入Y或y,循环也会继续运行!我想深入解释为什么会发生这种情况,我一直在努力推理它,回顾我的教科书等但我似乎无法理解为什么......我已经改变了OR进入一个AND,但是什么使OR如此糟糕并导致它出现故障?

谢谢大家。

3 个答案:

答案 0 :(得分:3)

条件(choice != 'y' || choice != 'Y')始终为true,因此循环将无限运行。 如果选择==&#39; y&#39;,则得到(false || true)== true; 如果选择==&#39; Y&#39;,则得到(true || false)== true。 您需要使用while(choice != 'y' && choice != 'Y')代替,在这种情况下,只有在您获得“&#39;或者&#39; Y&#39;,否则你得到(真实&amp;&amp;真实)并继续。

答案 1 :(得分:2)

如果至少有一个语句为真,则许多语句之间的OR运算符返回true,无论其他语句是假还是真。在您的情况下,choice != 'y' || choice != 'Y'将按如下方式进行评估:

  

第一条陈述为真:执行while循环。

     

第一个语句为false:检查第二个语句是否为真。

     

第二个陈述为真:执行while循环。

     

第二个陈述是错误的:不要在循环时执行。

具体来说,当编译器到达choice != 'y'时,如果choice == 'Y',则它仍将执行,因为choice != 'y'为真,实际上选择等于Y,所以它与y不同。

另一方面,如果选择等于y,那么它将检查第二个语句是否为真,但我们知道该选项等于y,所以{{1} }与choice不同,依此类推......

答案 2 :(得分:0)

你犯了一个错误,你应该改变&#34; ||&#34;到&#34;&amp;&amp;&#34;