goto und undefiniertes Verhalten
-
C von A bis Z schrieb:
Warum also ist goto so verpönt? Aus Performancegründen! Durch goto wird der normale Ablauf des Programms einfach unterbrochen. Ein weiterer Grund, goto nicht zu verwenden: Wenn mit goto in einen Anweisungsblock gesprungen wird, der lokale Variablen beinhaltet, ist das Verhalten systemabhängig.
Es gibt wohl kaum ein Problem, das sich nicht auch ohne goto lösen lässt. Man kann sagen, dass ein goto mit einem Sprung nach vorne nichts ausmacht. Von einem goto, das aber zurückspringt, kann nur abgeraten werden. In solch einem Fall (zurückspringen) können Sie die do while-Schleife als bessere Alternative verwenden.
Sprünge über Funktionsgrenzen sind mit goto ohnehin nicht möglich. Dafür gibt es die Funktionen setjmp und longjmp.
Nach dem Buch kann folgender Quelltext (das mir 5mal "Hallo Welt!" ausgibt) doch zu undefiniertes Verhalten führen - oder?
#include <stdio.h> int main(void) { int i = 0; SCHLEIFE: i++; printf("Hallo Welt!\n"); if(i < 5) goto SCHLEIFE; system("pause"); }
Also der Compiler könnte sich denken nach if(i < 5) "oh i brauch ich nicht mehr weg damit" - oder?
mmh auf der Seite von Shade (http://tutorial.schornboeck.net/schleifen.htm) ist folgendes Beispiel zu finden (ist aber C++):
#include <iostream> using namespace std; int main() { int i=0; Schleife: //dies ist ein Label if(i<10) { cout<<i<<'\n'; goto Schleife; } }
diese Programm kann doch auch zu undefinierten Verhalten führen - oder?
-
Sehr schlechter Programmierstil, sollte aber alles kein Problem machen. Dem Compiler ist es egal, ob das Label Schleife oder Auto heisst. Dass das, was dort programmiert ist, eine Schleifeist, erkennt er nicht.
-
Ne, undefiniertes Verhalten ist das nicht, die Variable ist bis zum Blockende gültig. Allerdings ist es natürlich unglaublich hässlich und verwirrend. Wenn du auf die Art etwas schreibst, das länger als 20 Zeilen ist, findest du dich sehr bald nicht mehr durch den Code durch.
-
0xdeadbeef schrieb:
Ne, undefiniertes Verhalten ist das nicht, die Variable ist bis zum Blockende gültig.
also ist es im Buch falsch - oder?
mmh stimmt die ist ja "Auto"
int i = 0;
wäre ja das gleich wie:
auto int i = 0;
und ist damit bis zum Blockende gültig - richtig erkannt?
-
Jupp, richtig erkannt.
Im Buch ist es aber trotzdem richtig, er meint nämlich eher etwas in der Art:
int main(void) { goto label; { int i = 1; label: /* i deklariert oder nicht? */ printf("%d\n", i); } return 0; }
-
0xdeadbeef schrieb:
goto label;
{
int i = 1;
label: /* i deklariert oder nicht? */
...wer sowas programmiert ist selber schuld wenn's nicht geht. der compiler sollte hier mindestens ein warning ausspucken. schlechter code ist aber kein argument gegen 'goto'.
-
henselstep schrieb:
Dass das, was dort programmiert ist, eine Schleife ist, erkennt er nicht.
Warum sollte er auch? Schleifen sind Hochsprachenkonstrukte. Der Compiler soll ja aus der Hochsprache Maschinensprache machen, nicht umgekehrt
.
-
Vertexwahn schrieb:
C von A bis Z schrieb:
Warum also ist goto so verpönt? Aus Performancegründen!
Bitte schmeiß dieses Buch weg, da wird ja nur Blödsinn verzapft.
Der Grund goto nicht zu verwenden ist, dass es dann oft schwerer ist den Ablauf des Programms nachzuvollziehen.
-
[quote="Shade Of Mine"]
Bitte schmeiß dieses Buch weg, da wird ja nur Blödsinn verzapft.quote]Das Buch kostet 39,90 Euro
naja - ich lese es erst noch zu ende (habe das gefühl, dass es besser wird)
werde mir kein buch mehr zu c zulegen, weil ich vorhabe in zukunft nur noch mit C++ zu arbeiten - das Buch und K&R will ich mir nicht zulegen weil dort C89 behandelt wird - oder sollte man das als guter C Programmierer gelesen haben?
zum Thema Performance:
ich dachte mit Goto wird ein Programm "schneller" - ob sowas schneller oder langsamer ist müßte man mal konkrett messen - da ich aber eh nicht vorhabe ein goto zu verwenden ists mir egal
-
http://pronix.linuxdelta.de/C/standard_C/c_programmierung_11_2.shtml Abschnitt 11.12.
Warum also ist goto so verpönt? Aus Performancegründen!
Könnte der Grund sein, dass die Compilerentwickler diese Art von Programmstrukturen bei der Optimierung nicht berücksichtigt haben und Compiler deshalb Goto-Code nicht so gut optimieren können, wie die klassischen der wohl strukturierten Programmierung!? Aus meiner Sicht ist das auch Unsinn, aber irgendwas muss der Autor sich doch dabei gedacht haben
-
Vertexwahn schrieb:
zum Thema Performance:
ich dachte mit Goto wird ein Programm "schneller" - ob sowas schneller oder langsamer ist müßte man mal konkrett messen - da ich aber eh nicht vorhabe ein goto zu verwenden ists mir egalWie sollt es denn schneller werden?
goto mach nen sprung, genau solche wie man bei if, switch, for, while, etc. uebrall hat. keine magie, garnichts.