为什么嵌套循环会产生相同的输出?

时间:2019-02-25 04:46:49

标签: c++

我正在编写一个程序来查找4位数字的地址。该程序应不断允许用户输入数字,直到解决正确的答案为止。其他参数是:

  • 所有四个数字都不相同
  • 千位数字是十位数的三倍 地点
  • 数字是奇数
  • 数字的总和是27

到目前为止,我已经编写了该程序,无论输入是什么,它都会为我提供“地址正确”的相同输出。试图弄清楚我在做什么错,但没有成功。这是我到目前为止编写的代码。

#include <iostream>
#include <cmath>
#include <string>

using namespace std;

int main()
{
    int const Address = 9837;
    int input;
    char Y;
    char N;
    int sum;
    int even;
    int i;

    cout << "Please enter a 4-digit number." << endl;
    cin >> input;

    {
        while (input = Y || N)
        {
            if (input = Y)
                cout << "Please enter a 4-digit number" << endl;
            else if (input = N)
                cout << "Good Bye!!" << endl;
            return 0;
        }
        while (input != Address && Y && N)
        {
            if (sum = input == !27);
            cout << "Not a valid address - the sum of the digits is not 27" << endl;
            if (input % 2 == 0)
                cout << "Not a valid address - the number is even." << endl;
        }
        input = Address;
        cout << "Address is correct." << endl;
    }
}

4 个答案:

答案 0 :(得分:2)

  • 您包括了<cmath><string>,但您没有使用这些标头中的任何内容。

  • 将变量声明/定义为尽可能接近/需要使用它们的地方。

  • 您正在使用未初始化的变量NY。它们包含不确定的值(=垃圾)。如果char恰好是unsigned,则允许在某些特定条件下读取不确定的值(未初始化的(unsigned) char)。但是您使用NY的方式是,读取它们的值会导致未定义的行为。

  • 从不使用变量eveni

  • 使用cin >> input;尝试从标准输入中提取int eger。如果用户输入YN或不是int的任何其他字符,提取将失败。您需要两种不同的方式来获取用户输入:1让用户输入自己的猜号码; 1让用户选择是否再次玩游戏。

  • 您在{之后引入了一个毫无用处的块(cin >> input;)。

  • while (input = Y || N) ...在C ++(和C)中使用运算符==进行了比较,但是分配了=。表达式input = Y || NY || N的结果分配给input,但是由于YN尚未初始化,因此包含值0的机会为相当低(0 || 0的取值为false),输入几乎总是1({true转换为int就是1),并且循环将始终执行。 实际上,读取YN的值会导致未定义的行为,因为它们尚未初始化。从理论上讲(因为编译器知道YN的值不确定),它可以生成喜欢的任何代码。

  • 在第一个while循环内:

       if (input = Y)  // is again an assignment, not a test for equality
           cout << "Please enter a 4-digit number" << endl;
       else if (input = N)  // again
           cout << "Good Bye!!" << endl;
       return 0;  // will always exit the program, no matter the value of input
    
  • 如果所有地狱都崩溃了,NY偶然都是0,因此可以到达第二个while循环, ,则input0(因为否则,第一个while循环的受控语句将被执行,并由return 0;退出程序)。当input等于0时,它不等于Address,因此input != Address会产生true,但由于我们知道N和{{1} }是Y0),而false给出true && false时,第二个false循环的受控语句将不会执行。

  • 我将跳过第二个while循环的受控语句的内容。足以说,他们没有按照您认为的去做。

  • while
  • input = Address;  // that assignment serves no purpose
    

    是变量cout << "Address is correct." << endl; YN时您总是会得到的输出,这可能会发生(特别是在运行调试代码时)。

请远离您当前正在学习C ++的资源。获得一本好教科书,然后重新开始。

答案 1 :(得分:0)

您在此处捕获的代码缺少某些内容或不完整?我看到Y,N和sum没有分配任何值,因此所有条件检查都失败了……最终它将始终显示“地址正确” ...

答案 2 :(得分:0)

您需要了解的几件事:

  • 在调用事物之前,应先为其分配值
  • 您应该阅读=和==
  • 之间的区别
  • 如果您需要多个输入,则cin >> input;应该在while循环中
  • 您的代码在某些地方缩进得不够
  • 您正在声明一个i整数,但是您从未使用过它。

换句话说:您的编译器必须向您发出许多警告。你看着他们吗?

答案 3 :(得分:0)

请记住=和==完全不同。 =表示分配。例如:int x = 100;表示将值100放入变量x。 ==表示比较或(等于)。例如:if(x == 100),表示x的值为100。

此外,如果您要为“是”或“否”选择变量, 您应该这样进行: 字符 if(ans =='Y'|| ans =='N“)

由于您的输入变量是一个int,而您的选择变量是一个char,因此while语句无效。