提问者:小点点

如何使C++中的值未定义?


我正在开发一个小程序,它将一个数字作为输入,检查它是否大于变量bange,并检查它是否小于变量smallest。 这些变量是用来记录到目前为止输入的最大值和最小值的。

唯一的问题是,这两个值一开始都包含垃圾值,所以我试图将它们都赋值为零,但当我这样做时,程序会中断,因为当我输入5,例如,它应该是最大和最小的值,但C++将零赋给最小的值。

#include<iostream>

int main() {
    double a, largest, smallest;
    while (std::cin >> a) { 
        if (largest < a)
            largest = a;
         if (smallest > a)
            smallest = a;

        std::cout << "The smallest so far: " << smallest <<'\n';
        std::cout << "The largest so far: " << largest << '\n';
    }
}

共3个答案

匿名用户

最简单的方法是将smallest设置为可能的最大值,将smallest设置为可能的最小值:

double largest = std::numeric_limits<double>::lowest();
double smallest = std::numeric_limits<double>::max();

如果您真的想让变量没有值,那就是std::optional的作用。 std::optional<;double>; 最大;将初始化为没有任何值。

匿名用户

带有std::可选。 https://en.cppreference.com/W/cpp/utility/optional std::optional可以有值,也可以没有值。 一开始,它没有价值。 您可以使用它来处理状态“Don't have yet a value assigned”

这里举一个你的例子:

#include<iostream>
#include <optional>

int main() {
    double a;
    std::optional<double> largest, smallest;
    while (std::cin >> a) {
        if (largest.has_value() == false || largest < a)
            largest = a;
        if (smallest.has_value() == false || smallest > a)
            smallest = a;

        std::cout << "The smallest so far: " << smallest.value() << '\n';
        std::cout << "The largest so far: " << largest.value() << '\n';
    }
}

匿名用户

只要在这两个比较中进行细微(但显著)的更改,就可以将magnesmallest初始化为nan(非数字)值,然后利用与nan值的所有比较都返回false这一事实:

#include <iostream>
#include <cmath>

int main()
{
    double a, largest = std::nan(""), smallest = std::nan("");
    while (std::cin >> a) {
        if (!(a <= largest))
            largest = a;
        if (!(a >= smallest))
            smallest = a;

        std::cout << "The smallest so far: " << smallest << '\n';
        std::cout << "The largest so far: " << largest << '\n';
    }
    return 0;
}

相对于cdhowie提供的答案,这并不是一个真正意义上的改进,但我还是提供了一个替代方法。

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(c++|中|值|未定义)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?