【问题标题】:While loop runs when false当为假时循环运行
【发布时间】:2017-06-08 09:58:55
【问题描述】:

我已经尽我所能来让它发挥作用。我已经对此进行了大量研究,并尝试了我能找到的所有可能的解决方案。我正在使用 QtCreator 并在 C++ 中进行编码。

int main() {
    int Die1, Die2;
    cout << "Die 1: ";
    cin >> Die1;
    cout << "Die 2: ";
    cin >> Die2;
    while ( (Die1+Die2 != '2')||(Die1+Die2 != '3')||(Die1+Die2 != '5')||(Die1+Die2 != '7')||(Die1+Die2 != '9')||(Die1+Die2 != '11')) {
        cout << "You Rolled a " <<Die1<< " and " <<Die2<< " for a Total of " <<Die1 + Die2<<". Please Roll Again\n";
        cout << "Die 1: ";
        cin >> Die1;
        cout << "Die 2: ";
        cin >> Die2;
    }

【问题讨论】:

  • 在什么情况下您认为所有这些条件都是错误的?
  • Die1Die2 是数字,将它们与实际数字进行比较,而不是数字的字符表示。
  • 当循环为 false 时运行 -- 你知道那是不可能的。
  • 您的while 条件始终为真,因为显然 Die1+Die2 不能同时等于 2 和 3 !所以它必须与其中一个不同,更不用说你的其他测试了......
  • 德摩根定律 - 这不仅仅是一个好主意。我喜欢在像这样的布尔表达式上使用它作为健全性检查,看看“else/not”条件是否也有意义,即 X==2 AND X==3 AND X==5 AND ... Doh!

标签: c++ while-loop


【解决方案1】:

您的代码:

(Die1+Die2 != '2') ||
(Die1+Die2 != '3') ||
(Die1+Die2 != '5') ||
(Die1+Die2 != '7') ||
(Die1+Die2 != '9') ||
(Die1+Die2 != '11')

将评估为:

A.
( 1+1 != 2 ) = false
( 1+1 != 3 ) = true
break;

B.
( 1+2 != 2 ) = true
break;

C.
( 1+3 != 2 ) = true
break;

...
( 1 + ( x>2 ) != 2 ) = true

你的逻辑本身就有缺陷,因为它会总是评估为true

编辑

正如其他人所指出的,您还试图将这些整数与它们的 char 值进行比较,这与您期望的不一致。

'0' = (hex)0x30 = (int)48
'1' = (hex)0x31 = (int)49
'2' = (hex)0x32 = (int)50
...

要解决此问题,您应该与实际数字进行比较:

( Die1 + Die2 != 2 )

【讨论】:

  • 他不是将它们与字符文字进行比较,而是将它们与字符串文字进行比较。当转换为整数时,这不是任何这些文字的值......
  • 虽然正确,但逻辑仍然不正确;这是我的答案。 OP应该能够修复语法错误。
  • 好了,我添加了更多细节描述以补充您的观点。
  • ...呃,将它们与它们的 char 值进行比较。 将它们与您将字符串文字的const char * 转换为整数类型时获得的整数进行比较。 They're rather different.
  • OP 将整数与字符串文字进行比较,例如 0 != ""。您正在与 character 文字进行比较,例如 0 != ' '。它们是不同的东西。注意不同的引号(字符串文字有双引号,字符文字有单引号)字符串文字的类型为const char *,字符文字的类型为char
【解决方案2】:

您可能想要检查您的 while 条件!

由于条件为否定,您可以使用 AND ( && ) 而不是 OR (||) 来组合它们。

编辑: 正如所指出的,您应该将 Die1 和 Die2 与数字进行比较。如果您想保持字符不变,可以将字符“0”添加到 Die1 和 Die2 的总和中。

这似乎工作正常:

#include <bits/stdc++.h>

using namespace std;

int main() {
    int Die1, Die2;
    cout << "Die 1: ";
    cin >> Die1;
    cout << "Die 2: ";
    cin >> Die2;
    while ( (Die1+Die2 != 2)&&(Die1+Die2 != 3)&&(Die1+Die2 != 5)&&(Die1+Die2 != 7)&&(Die1+Die2 != 9)&&(Die1+Die2 != 11)) {
        cout << "You Rolled a " <<Die1<< " and " <<Die2<< " for a Total of " <<Die1 + Die2<<". Please Roll Again\n";
        cout << "Die 1: ";
        cin >> Die1;
        cout << "Die 2: ";
        cin >> Die2;
    }

}

【讨论】:

  • 谢谢,我把它改回整数并将or语句替换为and语句,循环正常工作!
猜你喜欢
  • 2021-11-28
  • 2022-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-06
  • 2019-10-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多