2015-11-05 115 views
-3

我試着看着我的代碼,但我找不到問題。我做錯了什麼 ?雖然我認爲它的原因是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; 
} 
+4

很好的機會[學習如何調試小程序](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。 –

+0

順便說一下,你可以在運算符之間添加空格,因爲編譯器會忽略它們,但它們使你的代碼更具可讀性。 –

+0

好的編碼風格是每行聲明一個變量。這是更容易閱讀和維護。 –

回答

2

您在行l=ats/(s/60);中有零除以整數。 s60都是整數,因此當使用整數除法s=1060時,得到0,並且當將ats除以0時,會發生崩潰。如果你想避免在這種情況下,整數除法,使用:

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

B)l=ats/(static_cast<double> (s)/60);

但是要注意,這種變化後,結果將不再是int類型。如果你想在那裏有一個int,你需要使用static_cast<int>再次將它重新轉換回int,如下所示:l=static_cast<int> (ats/(s/60.0))

2

您的整數除以零。這在C++中是未定義的行爲。

s從來沒有由於模數大於59。

s/60將始終爲零,因爲整數除法截斷

1

s是小於60的整數。整數除法(s/60)給出0。所以,ats除以零。

3

由於%60,s將始終爲0到59(含)之間的整數。在下一行上,s/60將始終爲< 1,因此截斷爲0,因爲它是整數除法。除以ats這個結果除以0