【问题标题】:C++ : Unexpected outputC++:意外的输出
【发布时间】:2015-02-12 14:22:34
【问题描述】:

我有以下代码:

int a , b , sum;
cin>>a>>b;
sum=a+b;
cout<<sum;

我完全知道您不能将浮点值存储在整数中。 所以在我的程序第一次运行期间:

10 2.5

12

我得到 12 的预期输出,因为 2.5 的小数部分被忽略了

在第二次运行中,我将浮点值放在首位:

2.5 10

442837

我得到一个垃圾值,有人知道发生了什么吗?

感谢您的帮助:)

【问题讨论】:

  • "编译器会忽略 2.5 的小数部分" - 不是编译器会忽略它,因为您在运行时输入了这个数字。
  • @barakmanos 是的,我的错
  • 最好将所有内容都读入doubles,然后在需要时将其转换为ints。在任何情况下:检查您的流的状态:if (!cin) { error(); }.
  • 这可能会帮助您理解问题的其余部分(提示:它是 cin 对象在运行时“忽略”2.5 的小数部分)。
  • 5gon12eder 是对的,我打赌你的 cin 需要被清除

标签: c++


【解决方案1】:

初始化你的变量,你会看到发生了什么。它不是忽略小数。它导致停止解析的错误。所以你看到的这个疯狂的数字其实就是未初始化整数的值。

这是正在发生的事情: 当您输入“10 2.5”时,它会将 10 放入 a,将 2 放入 b。它不会忽略 0.5。要了解实际发生的情况,请尝试以下代码:

int a=100 , b=200 , c=300, sum;
cin>>a>>b>>c;
cout<<a<<endl;
cout<<b<<endl;
cout<<c<<endl;

然后输入“10 2.5”,a为10,b为2,c为300! ".5" 导致 cin 出现错误,因此它只是将 c 保留为默认值。但由于您只读取 2 个值,它似乎工作得很好。因此,请使用您的第二组输入“2.5 10”尝试该版本。 A 为 2,b 为 200,c 为 300。这说明 cin 在看到小数点时遇到错误,然后就放弃了。

最后,为了好玩,删除我示例中的初始化,看看你如何得到 b 和 c 的疯狂值。

【讨论】:

  • 哈!完美的答案,但是在SO中总是这样吗(这是我的第一个问题);人们提出问题会被否决?
  • 是的,它正在添加未初始化的值。看到这一点的另一件事是添加这一行:“cout
  • 感谢额外的 good() ,从来不知道这个功能
  • 看起来@5gon12eder 使用 if (!cin) 的方法更短
【解决方案2】:

引用std::istream::operator>>:“从流中按顺序提取和解析字符,以将它们解释为正确类型的值的表示,该值存储为 val 的值。”

查看std::istream::operator>>,深入了解读取输入的工作原理。

此外,你可以 std::cout > 操作不进行隐式类型转换,并被抛出错误状态。

【讨论】:

  • 感谢分享知识 :) +1
猜你喜欢
  • 2021-10-13
  • 2020-02-21
  • 2014-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-11
相关资源
最近更新 更多