【问题标题】:Why can't we use the same logical operator (AND/OR) for the same situation (input "Q"/"q") in "if" and "while"?为什么我们不能在“if”和“while”中对相同的情况(输入“Q”/“q”)使用相同的逻辑运算符(AND/OR)?
【发布时间】:2020-07-29 08:51:40
【问题描述】:
#include <iostream>
#include <vector>

using namespace std;

int main() { 
 char selection {};
 do {

        cout<<"\n---------------"<<endl;
        cout<<"1  do this "<<endl;
        cout<<"2  do that "<<endl;
        cout<<"3  do something else  "<<endl;
        cout<<"q  Quit  "<<endl<<endl;
        cout<<"Enter your selection : ";
        cin>>selection;

        if (selection=='1')
            cout<<"You chose 1 -- doing this "<<endl;
        else if (selection=='2')
            cout<<"You chose 2-- doing that "<<endl;
        else if (selection=='3')
            cout<<"You chose 3-- doing something else  "<<endl;
        else if (selection=='Q'||selection=='q')
            cout<<"Goodbye! "<<endl;
        else
            cout<<"Unknown value --try again  "<<endl;
 } while (selection!='q'&& selection!='Q');
 cout<<endl;   

 return 0;
}

【问题讨论】:

  • 您可以使用逻辑与和逻辑或。请描述您遇到的问题。这段代码对我来说很好。
  • 谷歌搜索布尔逻辑中的德摩根定律。
  • !A && !B == !(A || B)
  • @Swordfish 奇怪的是 OP 似乎理解德摩根定律,所以我不明白这个问题是关于什么的。
  • @john 我不确定他是否理解。

标签: c++


【解决方案1】:

您想知道为什么这两个条件在语义上描述相同的最终情况时使用相反的运算符(AND 与 OR)。

if (selection=='Q'||selection=='q')
/* ... */
while (selection!='q'&& selection!='Q')

如果你正确地反转它,他们可以使用相同的运算符。

if    ( (selection=='Q' || selection=='q'))
/* ... */
while (!(selection=='q' || selection=='Q'))

if    (!(selection!='Q'&& selection!='q'))
/* ... */
while ( (selection!='q'&& selection!='Q'))

(我对 () 的建议有点大方,显然其中一些是不需要的。)

因为第一个是第二个的反转。
你想做一些“如果”,你想循环“而不是”。

就像横向解决方案一样,只要循环中的任何位置都没有break,就可以将“再见”移出循环,然后无条件执行。然后你只检查一次结束条件,而不是两次。在我看来,这提高了可读性和可维护性。

【讨论】:

    【解决方案2】:

    为什么我们不能在“if”和“while”中对相同的情况(输入“Q”/“q”)使用相同的逻辑运算符(AND/OR)? p>

    因为情况不一样。为什么?让我们看看:

    else if (selection=='Q'||selection=='q') 
    

    上面的代码说,如果这个条件为真,即如果selection是q或者Q,则退出。

    while (selection!='q'&& selection!='Q')
    

    这句话说,如果条件不成立,继续循环。


    如果需要,您仍然可以在这两种情况下使用 ||&amp;&amp;。例如,以下两个是等价的:

    while (selection!='q'&& selection!='Q')
    //
    while( !(selection == 'q' || selection == 'Q') )
    

    请参阅 Yunnosch 的 the answer 了解更多详情。

    【讨论】:

    • 与明显较旧的现有答案相比,您是否想让您的答案提供的额外见解更加明显? (当然是我的)
    • 我回答的唯一要点是强调情况不一样。您的回答也说明了这一点,但不那么明显。但是,它深入探讨了如何使用相同的运算符。如果你能在一开始就在你的答案中强调这一点,我会记下我的
    • 无需删除您的。通过您的解释,我现在相信您尝试提供不同的角度,这就是我想要验证的全部。我自己没有看到它的事实并不能证明这一点。保留它。
    • 我的回答是基于“情况”、“时间点”、“语义条件”是相同的。您指出逻辑条件(在我的回答范围内,我称之为“句法情况”,以进行对比)是不同的。这是一个很好的不同角度。两者一起,或它们的对比,似乎很有启发性和帮助。我开始喜欢你的回答。 ;-)
    • 文风好,敢于挑战,捍卫自己的观点,同时保持礼貌和实事求是。
    猜你喜欢
    • 2015-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2016-08-29
    • 2022-08-17
    相关资源
    最近更新 更多