【问题标题】:What makes this program crash?是什么让这个程序崩溃?
【发布时间】:2015-11-05 14:48:16
【问题描述】:

我已尝试查看我的代码,但找不到问题所在。我做错了什么 ?虽然我认为是 l=ats/(s/60) 造成的。

#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int ats=7,v1=12,v2=12,m1=30,m2=40,g=70,l,s;
s=abs(((v2*60+m2)-(v1*60+m1))%60);
l=ats/(s/60);
cout << l;
return 0;
}

【问题讨论】:

  • 顺便说一句,您可以在运算符之间添加空格,因为编译器会忽略它们,但它们会使您的代码更具可读性。
  • 一种好的编码风格是每行声明一个变量。这更易于阅读和维护。

标签: c++ crash


【解决方案1】:

你有一个整数除以零。这是 C++ 中未定义的行为。

s从不由于模数而大于 59。

s / 60 将始终为零,因为整数除法截断

【讨论】:

    【解决方案2】:

    因为%60s 将始终是介于 0 和 59(含)之间的整数。在下一行,s/60 将始终 0,因为它是整数除法。除以 ats 得到除以 0

    【讨论】:

      【解决方案3】:

      l=ats/(s/60); 行中有整数除以零。 s60 都是整数,所以当你用整数除法来除 s=1060 时,你会得到 0,当你将 ats 除以 0 时,你会遇到崩溃。如果您想在这种情况下避免整数除法,请使用:

      a)l=ats/(s/60.0);

      b)l=ats/(static_cast&lt;double&gt; (s)/60);

      但请注意,在此更改之后,结果将不再是 int 类型。如果你想在那里有一个 int,你需要再次使用 static_cast&lt;int&gt; 将它转换回 int,如下所示:l=static_cast&lt;int&gt; (ats/(s/60.0))

      【讨论】:

        【解决方案4】:

        s 是小于 60 的整数。整数除法 (s/60) 得到 0。所以,ats 被零除。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-04-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多