首页 > 解决方案 > 为什么这个 C++ 代码不应该打印出变量?

问题描述

我有一个非常简单的 C++ 代码,它要求在循环中输入两个整数,并在每次迭代中打印它们,直到用户输入字符“|”。代码如下:

int main() {                                                                    
    int in_int1;                                                                
    int in_int2;                                                                

    cout << endl << "Enter numbers one at a time. Enter '|' to end.";           
    cout << endl << ">> ";                                                      
    while (cin >> in_int1 && in_int1 != '|') {                                  

        cout << ">> ";                                                          
        cin >> in_int2;                                                         

        if (in_int2 != '|') {                                                   
             cout << "int 1: " << in_int1 << endl;                              
             cout << "int 2: " << in_int2 << endl;                              
             cout << endl << ">> ";                                             
        } else break;                                                           
    }                                                                           

    return 0;                                                                   
}

这是一个完全符合预期的示例运行:

Enter numbers one at a time. Enter '|' to end.
>> 12
>> 44
int 1: 12
int 2: 44

>> 98
>> 45
int 1: 98
int 2: 45

>> |

程序按预期终止。

这是事情变得奇怪的示例:

Enter numbers one at a time. Enter '|' to end.
>> 54
>> |
int 1: 54
int 2: 0

程序终止

如您所见,即使代码从未进入if-block.
发生了什么?为什么程序打印两个整数而没有进入打印指令所在的块?每次我输入第一个数字并输入“|”时都会发生这种情况 在第二个输入提示。

更新
以下代码按预期工作:

int main() {                                                                    
    int in_int1;                                                                
    int in_int2;                                                                

    cout << endl << "Enter numbers one at a time. Enter '|' to end.";           
    cout << endl << ">> ";                                                      
    while (cin >> in_int1) { // CHANGE 1: the second condition was unnecessary 
        // because the condition fails when user enters non numeric
        // character anyway. Besides, I was comparing int with char.                                                    

        cout << ">> ";                                                          

        if (cin >> in_int2) { // CHANGE 2: similar logic applies here.                                                   
             cout << "int 1: " << in_int1 << endl;                              
             cout << "int 2: " << in_int2 << endl;                              
             cout << endl << ">> ";                                             
        } else {                                                                
            break;                                                              
        }                                                                       
    }                                                                           

    return 0;                                                                   
}

而不是输入“|” 为了终止程序,我在这里的评论者的帮助下发现,输入 124 使我的程序按预期运行。我发现intchar没有显式转换的比较通常是一个坏主意,因为编译器不会警告它,它有时会产生意想不到的结果。

标签: c++

解决方案


这个条件

if (in_int2 != '|') 

只有在您输入 ASCII 值时才能为假|。您可能天真地期望输入|被转换为 ASCII 值并存储在in_int2. 但是,这不会发生。如果用户不std::cin >> in_int2输入整数,则会失败。

如果要检查用户输入,可以将输入读取为std::string,首先检查它是否有效,然后才将其转换为int. 通常,您应该始终通过事后检查流的状态来检查输入是否std::cin成功(就像您在阅读时所做的那样in_int1)。

请注意,您的第一个示例也由于此条件的第一部分而终止:

 while (cin >> in_int1 && in_int1 != '|') {

当用户输入时,|输入失败并且在这种情况下转换cinbool哪个false。第一个示例没有终止,因为&& in_int1 != '|'. true同样,如果您输入了一个有效的整数(即条件的第一部分计算为)并且该整数是 的 ASCII 代码,该部分条件才会触发|


推荐阅读