c++ - 为什么这个 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 使我的程序按预期运行。我发现int
与char
没有显式转换的比较通常是一个坏主意,因为编译器不会警告它,它有时会产生意想不到的结果。
解决方案
这个条件
if (in_int2 != '|')
只有在您输入 ASCII 值时才能为假|
。您可能天真地期望输入|
被转换为 ASCII 值并存储在in_int2
. 但是,这不会发生。如果用户不std::cin >> in_int2
输入整数,则会失败。
如果要检查用户输入,可以将输入读取为std::string
,首先检查它是否有效,然后才将其转换为int
. 通常,您应该始终通过事后检查流的状态来检查输入是否std::cin
成功(就像您在阅读时所做的那样in_int1
)。
请注意,您的第一个示例也由于此条件的第一部分而终止:
while (cin >> in_int1 && in_int1 != '|') {
当用户输入时,|
输入失败并且在这种情况下转换cin
为bool
哪个false
。第一个示例没有终止,因为&& in_int1 != '|'
. true
同样,如果您输入了一个有效的整数(即条件的第一部分计算为)并且该整数是 的 ASCII 代码,该部分条件才会触发|
。
推荐阅读
- c++ - 对 push_back 与 pair 交互的困惑
- jquery - jquery返回值是什么意思?jQuery.fn.init(3) [...,prevObject: jQuery.fn.init(1)]
- rabbitmq - 从 Azure 服务总线向 RabbitMQ 发送消息
- api - E-Verify 是否提供 API 来验证员工的资格?
- javascript - 使用数据标题和不使用类或 ID 的 Web 抓取
- google-apps-script - 脚本编辑器中的功能可以正常工作,但不能来自工作表自定义功能
- rust - 如何更改 SpriteComponent 颜色?
- css - 将鼠标悬停在滚动条上时更改其宽度
- javascript - 在反应中使用该项目的ID滚动到特定项目?
- javascript - 活动幻灯片上的 Slick.js 边距