Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Sprungmarken?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ] [ 3 ]
000
05.04.2007, 12:32 Uhr
Suba Esel



Ist zwar vielleicht ne blöde Frage, aber warum sind Sprungmarken im "Normalgebrauch" so verpönt, obwohl sie in Klassen und besonders bei switch() sehr häufig vorkommen?
--
Simon
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
05.04.2007, 12:50 Uhr
Blubber2063



Ganz einfach, weil ein Sprung der nicht innerhalb einer Funktion passiert(also aus der Funktion rausspringt), den Stack nicht aufräumt, d.h. seine Variablen nicht abräumt und im Zweifelsfall auch den Rückgabewert nicht an die richtige Stelle packt, das führt unter Umständen zu undefinierbarem Programmverhalten. Und sie kommen ja im Normalgebrauch nicht häufig vor, zumindest nicht direkt, dort sind sie vom Compiler verwaltet und erlauben ohne ein return kein verlassen der Subroutine. Davon abgesehen reichen die "normalen" Kontrollflusstrukuren eingentlich auch ohne explizite Sprungmarken und goto's zu arbeiten.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
05.04.2007, 12:58 Uhr
Suba Esel



Ach so, ok, leuchtet irgendwie ein. Allerdings ist es ein bisschen blöd, wenn man switch durch if's ersetzen will.
--
Simon
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
05.04.2007, 14:29 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Was hat das damit zu tun?
Niemand sagt das man switches durch ifs ersetzen soll. Warum auch? Weil da spätestens auf Assemblerebene rumgesprungen wird? Das wird es sowieso andauernd, auch bei einem if-else

Was "verpönt" ist (und das imho zu recht) sind in C/C++ gotos, weil sie das Programm meistens sehr unübersichtlich machen und dadurch die Fehlersuche enorm erschweren. Es ist einfach schlechter Stil weil man das zu 99,9% der Fälle schöner hinbekommt und bei den 0,1% nehm ich sie trotzdem nicht
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
05.04.2007, 15:28 Uhr
0xdeadbeef
Gott
(Operator)


Naja, auch bei switch muss man ein bisschen aufpassen, und gegebebenfalls neeue Blöcke einführen. Zum Beispiel:

C++:
int foo = 2;

switch(foo) {
case 1:
  complex_datatype bar;
  break;
default:
  std::cout << "Ups" << std::endl;
}


...wo bar zwar nicht erzeugt, aber nachher aufgeräumt werden soll. Sinnigerweise sieht das dann so aus:

C++:
int foo = 2;

switch(foo) {
case 1: {
    complex_datatype bar;
    break;
  }
default:
  std::cout << "Ups" << std::endl;
}


Aber das ist zumindest noch handhabbar, sofern man nicht groben Unfug versucht, wie z.B. Duff's Device. goto dagegen - das ist richtig gefährlich.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
05.04.2007, 15:37 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Da hab ich mir zum Glück von Anfang an angewöhnt alles in den case Blöcken zwischen zwei {} Klammern zu stecken, ohne das ich das damals wußte. Ich fands einfach überscihtlicher so
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
05.04.2007, 16:29 Uhr
mischa
Fragender


wenn goto so verpönt ist und so gefärlich ist warum ist es bei c++ dabei und wird nicht einfach rausgeschmissen?
--
Latein Unterricht ist die spätere Rache der Römer an den Germanen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
05.04.2007, 16:32 Uhr
0xdeadbeef
Gott
(Operator)


Auch hübsch:

C++:
switch(subpoena_type) {
case CEASE_AND_DESIST:
  cease();
  /* FALL-THRU */
case DESIST:
  desist();
}


Oder, ganz fies,

C++:
switch(cnt % 8)  {
  do {
    foo();
case 7:
    foo();
case 6:
    foo();
case 5:
    foo();
case 4:
    foo();
case 3:
    foo();
case 2:
    foo();
case 1:
    foo();
case 0:
  } while ((cnt -= 8) > 0);
}



@mischa: Weil C++ davon ausgeht, dass der Programmierer weiß, was er tut.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 05.04.2007 um 16:32 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
05.04.2007, 16:35 Uhr
mischa
Fragender


irgend wie leicht vertig von ihnen
--
Latein Unterricht ist die spätere Rache der Römer an den Germanen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
05.04.2007, 16:51 Uhr
FloSoft
Medialer Over-Flow
(Administrator)



Zitat von 0xdeadbeef:
@mischa: Weil C++ davon ausgeht, dass der Programmierer weiß, was er tut.


Würde eher sagen - "Ach warum entfernen? da müssten wir doch zig tonnen code umschreiben" (schon mal in diverse Implementierungen der libc geschaut? )
und bei C++ haben ses nicht entfernt, um die Kompatibilität zu C nicht zu gefährden
--
class God : public ChuckNorris { };

Dieser Post wurde am 05.04.2007 um 16:52 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: