2016-04-01 32 views
1
#include <iostream> 

using namespace std; 

int main() { 
    int n,x; 
    int fact(int); 

    cin >> n; 

    x = fact(n); 

    cout << x; 

    return 0; 
} 

int fact(int n) { 
    if(n!=1) 
     return n*fact(n-1); 
} 

Son durumda, argüman işlev olgusuna iletildiğinde 1, kodumda belirtmeden, fact(1)'un 1'e eşit olduğunu nasıl hesaplayabilir?Bu yineleme programı neden çalışıyor?

+0

Bu işe yaramazsa: http://coliru.stacked-crooked.com/a/2c7260c2ee17d556. Daha iyi bir derleyici/uyarılar gerekir. – NathanOliver

+5

Kodunuz 'return' işlevini' return' olmadan sonlandırdığında, tanımlanmamış davranışınız vardır. – dasblinkenlight

+0

Yukarıdaki kodu derlemek için codeblocks ide kullanılır ve bana doğru cevabı veriyor, codeblocks güvenilmez mi? – srishti77714

cevap

10

Bu program, tanımlanmamış davranışlara dayanmaktadır. Çalışmak kesinlikle garanti edilmez, ancak gönderdiğiniz parametrenin (1), çağıran kodun geri dönüş değeri olarak algıladığı bir yerde bulunduğunu görmüş olabilirsiniz. Bu davranışa bağlı değil yapınız.

Birçok C++ derleyici semantik sorunu sahip olarak, bu kodu reddetmek: tüm kontrol yolları aslında() Bu fonksiyon imzası, bir tamsayı geri

2
int fact(int n); 

arasında bir değer iade değil, ancak n = 1 verildiğinde, uygulamanızda karşılık gelen bir geri bildirim yok. Bu durumda, işlev herhangi bir int değerini (ör. Bellekte çöp) döndürebilir ve davranış tanımsız olur. Derleyiciniz çalışmasına izin verse de buna güvenmemelisiniz.

Programınızı derlerken bir uyarı gördüğünüzden eminim.

uyarı: Kontrol olmayan boşluk fonksiyonunun son ulaşabilir [-Wreturn tipi]

Kişisel olarak, don benim ortamında (Mac OSX'te g ++), derleyici aşağıdaki uyarıda Bir derleyicinin bu tür bir hataya izin vermesinin iyi bir sebebi olduğunu düşünün (yani derleme başarısız olmalıdır).

Referans: Benzer bir soru aşağıda bulunur:

C++ return value without return statement

+0

Merhaba Toby, Tam açıklama eklemek için cevabı güncelledim. İnceleme için teşekkürler. –

+0

Bir MSVC++ 10'un biraz aşırı kıskanıldığını gördüm. 'Switch' ifadesiyle geçersiz bir işlev yazdım,' default 'da dahil olmak üzere vakalarının _all_'i bir değer döndürdü. Derleyici, işlevin kapanış küme ayraçından önceki son ifadesi olarak bir 'return' ifadesinin olmadığından şikayet etti. Kapanış küme ayracı kontrolüne ulaşmanın hiçbir yolu yoktu, ancak hata mesajını önlemek için sahte bir 'return' ifadesi eklemem gerekiyordu. – Logicrat

+0

Sanırım bu biraz konu dışı ama ilginç bir nokta.Benim düşünceme göre, MSVC++ 10'lar, programın olası tüm durumları belirttiğiniz şekilde derlenmesine izin vermelidir. yani, iyi bir programa izin vermemek için bir derleyicinin iyi bir nedeni olduğunu düşünmüyorum ;-) –

İlgili konular