无法算出这个按数字序列打印数字的小 C++ 程序的最后一个

Cannot work out the last of this little C++ program that prints numbers in numerical sequence

我目前正在做 "Programming: Principles and Practice Using C++",但我无法完成一项特定的练习。 在此程序中,用户将输入三个随机数,然后程序将 return 这些数字按数字顺序排列。如果输入的第一个和第二个数字是最低的,那么第一个和第二个数字 return 是正确的,但第三个数字不是,我不确定为什么。 这是代码:

int main()
{
    string barn;



    int val1 = 0, val2 = 0, val3 = 0;

    cout << "Enter the first number: ";
    cin >> val1;

    cout << "Enter the second number: ";
    cin >> val2;

    cout << "Enter the third number: ";
    cin >> val3;


    if (val1 < val2 && val3)
    {
        cout << val1 << " "; 

        if (val1 < val2)
        {
            cout << val2 << " ";
            cout << val3 << " ";
        }

        else
        {
            cout << val3 << " ";
            cout << val2 << " ";
        }
    }

    else if (val2 < val1 && val3)
    {
        cout << val2 << " ";

        if (val2 < val1)
        {
            cout << val1 << " ";
            cout << val3 << " ";
        }

        else
        {
            cout << val3 << " ";
            cout << val1 << " ";
        }
    }

    else if(val3 < val1 && val2)
    {
        cout << val3 << " ";

        if (val3 < val1)
        {
            cout << val1 << " ";
            cout << val2 << " ";
        }

        else
        {
            cout << val2 << " ";
            cout << val1 << " ";
        }
    }

    cin >> barn;
}

1 3 5 打印:1 3 5。 3 1 5 打印:1 3 5。 3 5 1 打印:3 5 1` - 这就是我的问题所在。第二个 else if 语句似乎没有正常工作,我不确定为什么。

这和你想的不一样:

if (val1 < val2 && val3)

当(val1 大于 val2)且(val3 的计算结果不同于 0)时,您的 if 条件为真

你应该做 if (val1 < val2 && val1 < val3)

同样的规则适用于其他 if 语句。

另外你内心的if说法也不正确。示例:检查 val1 < val2 && val1 < val3 后,您应该检查 val2 < val3。下面是您的第一个 if 语句的示例:

if (val1 < val2 && val1 < val3)
{
    cout << val1 << " "; 

    if (val2 < val3)
    {
        cout << val2 << " ";
        cout << val3 << " ";
    }

    else
    {
        cout << val3 << " ";
        cout << val2 << " ";
    }
}

最后你应该想到用户多次输入相同值的情况。

顺便说一句,351 不会让您进入第三个 else if 语句。检查您的运算符优先级或完全写出您的运算符,例如:

else if ((val3 < val1) && (val3 < val2)) 

另见:http://en.cppreference.com/w/cpp/language/operator_precedence

Imo,您应该始终完整地写出您的运算符,尤其是如果您是该语言的新手,这真的很有帮助。 :)

这个:

if(val1 < val2 && val3){...}

并不代表您认为的那样。正确的写法是:

if((val1 < val2) && (val1 < val3)){...}

额外的括号可能不是必需的,但我在这种情况下的规则是安全而不是抱歉:)

内容:

if(val1 < val2 && val3){...}

的作用是,如果布尔值 (val1 < val2)(val3) 为真,则 returns 为真。如果 val3 非零 (**cf EDIT 部分),则 (val3) 被评估为真,否则被评估为假。

更改您的代码以考虑到这一点,然后告诉我们它是否有效,我没有检查其余部分是否正确。

编辑

我的回答被编辑为说除 0 以外的任何值都被评估为真。

对了,谢谢 :) 我想知道是什么误导了我可能对其他人有用。

  1. 我在 C++ 文档中找不到任何关于它的参考,但我想这是每种语言的规范。
  2. 表达式 (5 == true) returns false,但是 (5) 被计算为 true。 我想那是因为在 (5 == true) 中,true 被转换为 int 值 1 并且比较是在 int 值之间进行的,而不是布尔值。 (true == 5) 也 returns false.

这肯定是初学者的错误,我以此为教训进行明确的条件测试,并且从不相信程序会按照我的意愿对其进行评估。