我正在阅读《编程:使用 C++ 的原理与实践》。目前我正在做第三章的练习,但是有一个问题难住了我。现在我可以让代码正常工作了,但我对程序对我的输入的反应感到更加困惑。
问题来了: 编写一个程序,提示用户输入两个整数值。将这些值存储在名为 val1 和 val2 的 int 变量中。编写程序来确定这些值的较小值、较大值、总和、差值、乘积和比率,并将它们报告给用户。
这是我的代码:
cout << "Hello, please enter two integers: ";
int val1;
int val2;
int garbage;
cin >> val1 >> val2 >> garbage;
cout << "Val1: " << val1
<< "\nVal2: " << val2
<< "\nGarbage: " << garbage << '\n';
if (val1 < val2)
cout << "\nval1 is smaller than val2.";
if (val1 > val2)
cout << "\nval1 is bigger than val2.";
int sum = val1 + val2;
int difference = val1 - val2;
int product = val1 * val2;
double ratio = 1.0 * val1 / val2;
cout << "\nRatio: " << ratio
<< "\nSum: " << sum
<< "\nDifference: " << difference
<< "\nProduct: " << product << '\n';
可以以某种方式向我更深入地解释在这种情况下应该发生什么关于运算符 >> 和 cin 在幕后所做的事情,以及为什么在我在程序中输入字符串“90.8 9”后比率变为“inf” ?
谢谢你。
现在我所做的不是输入直接整数而是输入双精度数来看看会发生什么。现在显然我知道 cin 根据 >> 运算符的第二个操作数的类型解析值。但我所做的是将以下字符串输入到程序中:“90.8 和 9”
不知何故,比率变量在屏幕上输出为“inf” val2 为 0。
Val2 可能为零,因为 >> 的操作方式,即如果它在应该检测整数变量的 int 时检测到字符串,>> 会将第二个操作数的值调整为 0。但我不确定...
“垃圾”变量只适合我,我认为 cin 做了以下操作:查看值 90,在 val1 中输入值 90,查看包含字符 .8 的字符串并在 val2 中输入 0,在垃圾中输入 9。 但由于某种原因,9 没有被输入到“垃圾”中。垃圾现在是一个文字垃圾值,里面有一个随机整数。
这是我的程序的输出:
Hello, please enter two integers: 90.8 9
Val1: 90
Val2: 0
Garbage: -858993460
val1 is bigger than val2.
Ratio: inf
Sum: 90
Difference: 90
Product: 0
在这一行
cin >> val1 >> val2 >> garbage;
当您输入
90.8 9
时,会发生以下情况:
cin
尝试读取一个整数。我成功解析了 90
并将其存储在 val1
中。cin
尝试解析另一个整数,但它遇到了 .
作为下一个字符。因此,提取 int
失败,并且 0
被分配给 val2
。 std::cin
现在处于失败状态,在清除其状态之前不会进行进一步的提取。cin
不会尝试提取更多内容,因为它处于失败状态。因此它也不会将 0
分配给垃圾。因此 garbage
具有不确定的值。您无法阅读它或将其打印到屏幕上。尽管如此,您的代码仍然执行此操作,这意味着您的代码具有未定义的行为,其输出可以是任何内容。然后在这一行
double ratio = 1.0 * val1 / val2;
当
val1 = 90
和val2 = 0
时。所发生的情况是,首先评估 1.0 * val1
以产生 val1
的值,但作为 double
。线路基本相同
double ration = static_cast<double>(val1) / val2;
因此除法使用浮点除法(不是整数除法,除以 0 是未定义的),结果是
inf
。