Division durch NULL verhindern
-
while == if
-
Was für einen Vergleichsoperator nutzt Du denn für diese Gleichung ?In dem Fall ist das while zwar wie ein if verwendet, aber ein while ist kein if. (alle Schleifen lassen sich mit if und goto herstellen und dennoch würde keiner Behaupten, dass if/goto dasselbe wie for/while/do{}while ist)
-
niemand schrieb:
Was für einen Vergleichsoperator nutzt Du denn für diese Gleichung ?Das ist ja mein Problem, das mit den Abfragen und den dazugehörigen Vergleichsoperatoren, kommen erst in den nächsten Stunden drann, und wir dürfen nur das verwenden was wir bis hierher haben. Und das ist nicht viel.
Das mit den try-Blöcken kommt auch erst später.FireFlow schrieb:
Bei mir ist das auch eine logische Operation / Ausdruck, ist ja nur die "Kurzform" von if-else.
Ich haben nicht logische Operation, sondern logische Operatoren (!, &&, ||) geschrieben. Eigentlich meinte Vergleichsoperatoren.
Mein erster Ansatzt war es mit Typecasting zu probieren, aber das hat nicht so funktioniert wie ich mir gedacht habe.
-
Ben04 schrieb:
Soweit ich weiß definiert der Standard nicht was bei einer Teilung durch 0 passiert.
Der Standard definiert es, und zwar als "undefined behaviour" (5.6.4 [expr.mul]). Man beachte: undefined, nicht implementation defined.
-
7H3 N4C3R schrieb:
Ben04 schrieb:
Soweit ich weiß definiert der Standard nicht was bei einer Teilung durch 0 passiert.
Der Standard definiert es, und zwar als "undefined behaviour" (5.6.4 [expr.mul]). Man beachte: undefined, nicht implementation defined.
Liegt undefinertes Verhalten denn nicht ausserhalb des Standards und somit in den Händen der Compilerherrsteller? Irgendwie versteh ich den Unterschied den du da machst nicht.
-
Undefiniertes Verhalten ist undefiniert. Jedes Programm, das undefiniertes Verhalten enthält, ist kein gültiges C++ Programm. Punkt.
Spekulationen, was ein bestimmter Compiler damit nun macht, sind völlig irrelevant. Er wäre völlig legitim, Dir für undefiniertes Verhalten die Festplatte zu formatieren
Implementation-Defined heißt dagegen: Jeder Compiler/Bibliothekshersteller liefert ein für sich definiertes, aber nicht allgemeingültiges und für sich dokumentiertes Verhalten.
-
Er wäre völlig legitim, Dir für undefiniertes Verhalten die Festplatte zu formatieren
det wär gemein
-
Reigin schrieb:
Mein erster Ansatzt war es mit Typecasting zu probieren, aber das hat nicht so funktioniert wie ich mir gedacht habe.
wenn du nach bool casten darfst, muss es aber gehen.
ich will a/b schaffen.
wenn b==0, soll b erst verändert werden.also
a/(b+(b==0))
a/(b+!bool(b))
a/(b+(1-bool(b)))man könnte auch anders versuchen, festzustellen, ob b==0
sagen wir mal, ich will alle gesetzten bits auf eins zusammenwerfen.
(b)|(b>>16)
wirft schonmal die 32 bits auf 16 zusammen.
also sagen wir mal
int c=b;
c=(c)|(c>>16);
c=(c)|(c>>8);
c=(c)|(c>>4);
c=(c)|(c>>2);
c=(c)|(c>>1);
nu ist c=bool(b)
und wie gehabt
a/(b+(1-c))
-
oder einfach ein switch
switch(b) { case 0: cout << "geht nich" << endl; default: cout << a/b << endl; };
-
7H3 N4C3R schrieb:
Spekulationen, was ein bestimmter Compiler damit nun macht, sind völlig irrelevant. Er wäre völlig legitim, Dir für undefiniertes Verhalten die Festplatte zu formatieren
Sprich das Verhalten ist Festplattenreformation und das Auftretten dieses Verhalten hängt von der Implementierung ab.
7H3 N4C3R schrieb:
Implementation-Defined heißt dagegen: Jeder Compiler/Bibliothekshersteller liefert ein für sich definiertes, aber nicht allgemeingültiges und für sich dokumentiertes Verhalten.
Das heist der Unterschied besteht darin, dass hier der Herrsteller irgendwo das Verhalten dokumentiert hat und bei undefiniertem Verhalten nicht? Ach was für eine Paragrafenreiterei.
-
Implementation-Defined
Falsch nicht das er dokumentiert hat d heißt nämlich wenn er es nicht tut is auch gut, sondern er muß ein eindeutiges Verhalten implementiern und dokumentieren.undefiniertes Verhalten,
da kann er was implemtieren und nicht dokumentieren oder implementieren und nicht dokumentieren oder nichts tun, oder sich darauf verlassen das das OS was tut.Und das ganze ist nicht nur Paragraphen-Reiterei
-
Ben04 schrieb:
7H3 N4C3R schrieb:
Spekulationen, was ein bestimmter Compiler damit nun macht, sind völlig irrelevant. Er wäre völlig legitim, Dir für undefiniertes Verhalten die Festplatte zu formatieren
Sprich das Verhalten ist Festplattenreformation und das Auftretten dieses Verhalten hängt von der Implementierung ab.
7H3 N4C3R schrieb:
Implementation-Defined heißt dagegen: Jeder Compiler/Bibliothekshersteller liefert ein für sich definiertes, aber nicht allgemeingültiges und für sich dokumentiertes Verhalten.
Das heist der Unterschied besteht darin, dass hier der Herrsteller irgendwo das Verhalten dokumentiert hat und bei undefiniertem Verhalten nicht? Ach was für eine Paragrafenreiterei.
Das ist sicher verwirrend, aber die Begriffe sind Teil des C++-Standards und daher nicht frei wählbar, sondern genau definiert.
Der Unterschied liegt darin, das der Herrsteller das Verhalten festlegen kann, aber es muß halt definiert sein, denn implementation-defined behavior gibt dem Hersteller Spielraum für die Implementation. So sind zum Beispiel die typeinfo-Inhalte mehr oder weniger implementation-defined, aber es ist natürlich möglich sie sinnvoll (aber nicht immer portabel) zu nutzen.
Der Standard sagt daher zu implementation-defined behavior (iso14882: 1.3.5) das es sich um Verhalten in einem korrekten Programm und korrekten Daten handelt, das auf dokumentierten Implementations-Details basiert, für undefined behavior (iso14882: 1.3.12) hingegen Verhalten das in einem fehlerhaften Programm oder bei fehlerhaften Daten auftritt und für das unspezifiziert ist, was zu passieren hat.
Die Unterscheidung macht Sinn und lässt sich gekürzt zusammenfassen mit implementation-defined behavior ist akzeptabel, undefined behavior gibt ein Bug-Ticket.
-
ich progge schon seit jahren schon mit undefiniertem verhalten. meinem computer ist dabei aber noch nichts schlimmes passiert.
also halb so wild.
-
parallaxe schrieb:
oder einfach ein switch
switch(b) { case 0: cout << "geht nich" << endl; default: cout << a/b << endl; };
stürzt trotzdem ab bei b==0 *g*
rely schrieb:
ich progge schon seit jahren schon mit undefiniertem verhalten. meinem computer ist dabei aber noch nichts schlimmes passiert.
also halb so wild.für dich verhält es sich definiert, dann ist es ja gut
btw: was habt ihr eigentlich gegen
if (b) x = a/b; else // geht nicht
-
ups, stimmt, da muss natürlich noch ein break dahinter
@net : wenn du nochmal den eingangsbeitrag liest, weißt du warum wir keine if-lösung anbieten
-
parallaxe schrieb:
@net : wenn du nochmal den eingangsbeitrag liest, weißt du warum wir keine if-lösung anbieten
ach ja, ich guck immer etwas schief. hattet ihr schon den?
result = b ? a/b : INT_MAX;
-
es geht nur um div/0 verhindern?
int saveDiv(int i,int j) { return i/(j+std::numeric_limits<double>::epsilon())+0.5; }
-
net: Ja, ich.
-
Definiert, aber nicht wohldefiniert!