为什么这不会返回true(循环逻辑)

时间:2014-10-21 14:22:48

标签: c++ loops logic

std::string turnsDefined;
std::cin >> turnsDefined;
bool hasPassed;    
while(hasPassed != true){
    for(char c : turnsDefined){
        if(isdigit(c) != true){
            std::cout << "Please only use numbers to describe the amount of turns you'd like to do." << std::endl;
            hasPassed = false;
            break;
            std::cin >> turnsDefined;
        }else{
            hasPassed = true;
        }
    }
}

我最近偶然发现了这一点。我缩短了代码(合理的数量),这样你就可以自己试一试。

此简短程序应检查您输入的内容是否包含(不需要的)字母。我不明白的事情:我写它的方式,我很确定如果我输入类似test2test的东西它会传递(即使它包含字母)只是因为if语句将识别一个单一的数字并设置{{1到真。

我希望你能理解我所写的内容。很高兴回答更多问题。

2 个答案:

答案 0 :(得分:4)

您的代码中未初始化

bool hasPassed。 你应该声明为:

bool hasPassed = false;

Live code here

未初始化的自动(本地和非静态)变量包含不确定的值。 在分配值之前读取它们会导致未定义的行为。 (编译器在这里可以自由地做一些错误,但在实践中它可能包含真或假或其他一些无意义的值)

编辑
来自Andy Newman的评论: 条件if(isdigit(c) != true)是可以保留的。因为isDigit返回int,所以应避免将其与true进行比较。

  如果字符是a,则

isDigit返回非零值(true)   数字字符,否则为0(假)。

您可以更好地将条件重写为:

if(!isdigit(c)) {

即使函数返回bool,也要superfluous将其与truefalse进行比较

答案 1 :(得分:1)

来自C ++标准:

  

以本国际标准描述的方式使用bool值   “未定义”,例如通过检查未初始化的值   自动对象,可能会使它表现得好像它既不是真的   也不是假的。