C++ 我的while循环条件不是';t将其评估为I';我期待着

C++ 我的while循环条件不是';t将其评估为I';我期待着,c++,C++,我试着做一个输入验证函数,检查cin是否失败(这很好),我也试着让它检查它是否在我通过变量传递给函数的最小-最大范围内 我已经尝试过处理不同的条件,并手动评估,但似乎要么我遗漏了while循环的一些细节,要么完全不同 void isValid(int &value, std::string message, int min, int max) { while(((std::cout << message) && !(std::cin >>

我试着做一个输入验证函数,检查cin是否失败(这很好),我也试着让它检查它是否在我通过变量传递给函数的最小-最大范围内

我已经尝试过处理不同的条件,并手动评估,但似乎要么我遗漏了while循环的一些细节,要么完全不同

void isValid(int &value, std::string message, int min, int max) {
    while(((std::cout << message) && !(std::cin >> value)) && ((value >= min) && (value <= max))) {
        std::cout << "Error with input" << std::endl;
        std::cin.clear();
        std::cin.ignore(std::numeric_limits<int>::max(), '\n'); }
void有效(int&value,std::string消息,int-min,int-max){

虽然((std::cout>value))&&((value>=min)&&((value我认为您试图在循环中做太多有条件的事情。这方面的证据是,您——作者,以及最有可能一眼就能理解代码的人——已经对布尔逻辑感到困惑

为了使逻辑更简单、更易于阅读和正确,我们可以应用的原则将代码分为两部分:一部分负责获取输入,另一部分负责处理失败时发生的情况:

// returns true if a valid value entered, false if invalid or I/O error
bool getInput(int& value, const std::string& message, int min, int max) {
    if (!(std::cout << message)) return false;
    if (!(std::cin >> value)) return false;
    return value >= min && value <= max;
}

void getValidInput(int& value, std::string message, int min, int max) {
    while (!getInput(value, message, min, max)) {
        std::cout << "Error with input" << std::endl;
        std::cin.clear();
        std::cin.ignore(std::numeric_limits<int>::max(), '\n'); }
    }
}
//如果输入的值有效,则返回true;如果输入的值无效或I/O错误,则返回false
bool getInput(int&value,const std::string&message,int min,int max){
如果(!(std::cout>value))返回false;

return value>=min&&value尝试用简单的英语重新表述您的逻辑条件,看看这对您是否有意义:当提取操作失败且提取的值大于最小值且小于最大值时,该值无效,必须重新输入。这对您有意义吗?如果大于t最小值小于最大值是无效的(即使忽略所有其他因素)??正如斯波克先生所说:这是不合逻辑的。你需要考虑在这里输入无效意味着什么。@SamVarshavchik我想我在跟踪你。我应该等到有了有效的输入,然后再进行另一个while循环,只检查它是否在最小-最大值内吗?不,你应该做的是用简单的英语写出循环条件,所以当它严格地由简单的英语单词组成时,你就有了意义。只有当最终结果是完全有意义的时候,你才把你写下来的东西直接翻译成C++。