【问题标题】:Use of Logical Operator in Loop Condition在循环条件中使用逻辑运算符
【发布时间】:2020-04-04 01:19:55
【问题描述】:

在下面给出的代码中,为什么|| 逻辑不起作用,而是在使用&& 时循环终止?

int main() {
    char select {};
    do {
        cout<<"Continue the loop or else quit ? (Y/Q): ";
        cin>>select;
    } while (select != 'q' && select != 'Q'); // <--- why || (or) doesn't work here ??
    return 0;
}

【问题讨论】:

  • || 将使其始终为真。想想看。它必须始终不等于其中的 一个
  • 它完全按预期工作。
  • 考虑这个简单的问题:'q' 是否等同于 'Q'?不,不是。因此,如果select != 'q'false,则意味着select == 'q' 必须为true。但是,select != 'Q' 肯定不是 true (因为'q' != 'Q')?反之亦然?结果是,在该上下文中使用|| 可以保证始终为真的整体表达式。事实上,一个体面的编译器会警告你。
  • @WhozCraig:我并不想刻薄。我的评论是这样吗?
  • @FredLarson 不,一点也不。相信我,我无疑是 snarky 的获奖者。实际上试图不成为;你很好。

标签: c++ loops while-loop do-while logical-operators


【解决方案1】:

select 不是q 并且 它不是Q 时,此循环将继续:

while (select != 'q' && select != 'Q'); 

select 不是q 不是Q 时,此循环将继续。

while (select != 'q' || select != 'Q'); 

因为其中一个必须是真的,所以它会永远持续下去。

例子:

  1. 用户输入q

select != 'q' 计算结果为 false
select != 'Q' 计算结果为 true
false || true 计算结果为 true

  1. 用户输入Q

select != 'q' 计算结果为 true
select != 'Q' 计算结果为 false
true || false 计算结果为 true

【讨论】:

    【解决方案2】:

    您希望在 select 等于 'q''Q' 时终止循环。

    相反的条件可以写成这样

    do {
        cout<<"Continue the loop or else quit ? (Y/Q): ";
        cin>>select;
    } while ( not ( select == 'q' || select == 'Q' ) );
    

    如果打开括号,那么你会得到

    do {
        cout<<"Continue the loop or else quit ? (Y/Q): ";
        cin>>select;
    } while ( not( select == 'q' ) && not ( select == 'Q' ) );
    

    这又相当于

    do {
        cout<<"Continue the loop or else quit ? (Y/Q): ";
        cin>>select;
    } while ( select != 'q' && select != 'Q' );
    

    【讨论】:

      【解决方案3】:

      考虑以下图表:

      整个椭圆都是字符。白点分别是qQ。黑色填充区域描绘了将构成表达式true 的字符。第一行是select != 'q' &amp;&amp; select != 'Q',第二行是select != 'q' || select != 'Q'

      &amp;&amp; 表示两个条件都必须是true。生成的黑色区域是左侧两个区域的重叠。

      || 表示其中一个条件必须是true。生成的黑色区域是左侧两个区域的总和。

      【讨论】:

      • 很棒的例子!感谢用户:4117728 ??​​?
      猜你喜欢
      • 1970-01-01
      • 2015-02-12
      • 1970-01-01
      • 2016-11-20
      • 1970-01-01
      • 1970-01-01
      • 2018-06-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多