Dürfen bei c++ keine zwei if Anweisungen auftreten??
-
Hallo, ich hatte die funktion für Binominalkoeffizientenberechnung geschrieben
int Binom (int m, int n){ int bn; if(n<0 || n>m) bn=0; else if(m==0 && n==0) bn=1; else bn = Binom(m-1,n-1)+Binom(m-1,n); return bn; }Und statt else if hatte ich nur if stehen bei der zweiten Anweisung. Dadurch bekam ich bei Ausführen des Programms den Fehler: "Segmentation fault".
Nun meine frage: warum darf hier nicht zwei mal das if stehen ?
-
Das if darf hier natürlich "zweimal stehen". Den Segfault bekommst du wohl, weil es ein Fehler in deiner Programmlogik ist, wenn das if dort "zweimal steht"...
EDIT: Ich würd mir generell noch mal überlegen, ob das überhaupt stimmen kann was du da gebaut hast...
-
dot schrieb:
Das if darf hier natürlich "zweimal stehen". Den Segfault bekommst du wohl, weil es ein Fehler in deiner Programmlogik ist, wenn das if dort "zweimal steht"...
Ja, aber das gleiche mit C geschrieben ergibt keinen Fehler.
-
Namal schrieb:
Ja, aber das gleiche mit C geschrieben ergibt keinen Fehler.
???
Der Schnipsel, den du da gepostet hast, ist genauso gültiges C wie C++. Auch mit "zweimal if".
edit: natürlich ist die Programlogik mit "zweimal if" völlig falsch.
if(a == 0) machWas(); if(a == 1) machWasAnderes(); else machWasTolles();Preisfrage an dich: wenn a == 0 ist, macht das Programm dann was tolles?
-
Ohne Code nix los. Lies dir mal den dritten Link in meiner Signatur durch, welcher Code hier wohl relevant sein dürfte.
-
Das hier ist der gesammte Quelltext
#include <iostream> using namespace std; int Binom (int m, int n){ int bn; if(n<0 || n>m) bn=0; else if(m==0 && n==0) bn=1; else bn = Binom(m-1,n-1)+Binom(m-1,n); return bn; } int main (){ cout<<"Wieviele Zeilen sollen ausgegeben werden?"<<'\n'; int i; cin>>i; for(int m=0;m<i;++m){ for(int n=0;n<=m;++n) cout<<Binom(m,n)<<" "; cout<<'\n'; } }
-
Wenn n < 0 oder n > m ist, dann möchtest du eigentlich abbrechen. Das prüfst du in Zeile 9. Wenn die Bedingung zutrifft wird bn = 0 gesetzt und da das darauf folgende alles im else-Zeig vom if in Zeile 9 steht, rutscht der Programmablauf danach zum return in Zeile 15. So willst du es auch.
Lässt du aber das erste else weg, so wird auch if(m==0 && n==0) geprüft. Dies ist aber unwahr (wenn Zeile 9 wahr war). Daher wird der else-Zweig dazu ausgeführt. In diesem steckt aber die Rekursion. Folglich bricht die Rekursion niemals ab und du bekommst einen Fehler.
Dies wäre aber in C genau so, da, wie schon korrekt festgestellt wurde, deine Funktion in C genau so aussähe und die Sprachen nun auch nicht so unterschiedlich sind, dass es hier relevant wäre. Daher wäre dein C-Programm interessant zu sehen, dieses ist nämlich bestimmt nicht äquivalent.
-
Ja, danke, dann hat sich das aufgeklärt. Bei meinem C programm, hatte ich die ersten beiden Anweisungen vertauscht rum stehen, deshalb gabs bei der Ausgabe zwar keinen fehler, aber lauter Nullen

-
int Binom (int m, int n){ if(n<0 || n>m) return 0; if(m==0 && n==0) return 1; return Binom(m-1,n-1)+Binom(m-1,n); }