Frage von Fragechamp, 47

Wie kann man in c mit Hilfsvariablen umgehen?

Hallo,
wollte mal fragen, ob ich folgende Code auch ohne Hilfsvariable schreiben kann:

...  
struct node *a=...;     
... // hier wird a verändert  
struct node *hilf=a;  
a=(*a).next;  
memset(hilf,0,sizeof(*hilf));  
free(hilf);  
...

2tens kann ich folgenden Code in einem Befehl schreiben?:

int a=...;
//ein paar Berechnungen mit a
printf("%i",a);
a=0;

so wie, bei dem operator a--:

printf("%i",a--); //output ist a, a wird aber dekrementiert

Vielen Dank im Vorraus
Fragechamp

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von TeeTier, Community-Experte für programmieren, 25

Zu 1: Nein. Die Hilfsvariable wird benötigt, da du den .next-Zeiger deiner Verlinkten-Liste ja sowieso erst mal retten musst, bevor du das Objekt an sich wieder frei gibst. Umgekehrt geht es nicht, also benötigst du eine Hilfsvariable. Allerdings ist es kein Guter Stil, Variablen zu "recyclen", und der Compiler wird zu viele Hilfsvariablen sowieso wegoptimieren. Deshalb schreib lieber:

struct node *a = ...;

// mach irgendwas mit a ...

struct node *n = a->next;

memset(a, 0, sizeof(*a)); // paranoid?
free(a);

a = n;
n = NULL; // paranoid! :)

Darüber hinaus würde ich für "struct node" einen typedef einführen, eine generelle Überprüfung auf (Rückgabe-)Fehler einbauen, und mir überlegen, ob die gesamte Reihenfolge aller Anweisungen überhaupt sinnvoll ist. (ich würde weder dein, noch mein Codesnippet verwenden) :)

Zu 2: Ja, kannst du so schreiben. "%i" und "%d" sind synonym für vorzeichenbehaftete Integer einsetzbar. Guckste hier:

http://www.cplusplus.com/reference/cstdio/printf/

(Das ist zwar die C++-Doku, aber sowohl die Formatspezifizierer, als auch das restliche Verhalten von printf() sind mit ANSI-C identisch ... ausgenommen der Name der Header-Datei)

Zu 3: Wenn der Wert von a vorher 5 ist, dann wird auch 5 ausgegeben, und nach der printf()-Zeile ist der Wert von a dann nur noch 4.

Viel Spaß! :)

Kommentar von Fragechamp ,

danke schonmal! :)

Dass der Compiler überhaupt etwas wegoptimiert wusste ich gar nicht :) 

ich habe allerdings noch nicht so ganz verstanden, was an deinem Code besser ist. Ist meiner "bad", weil ich Operationen mit der Hilfsvariable durchführe oder dann bei mir nichts wegoptimiert wird, ...?

Die zweite und letzte! Frage hast du falsch verstanden :D

Ich habe gefragt, ob man

printf("%i",a);
a=0; 

auch iwie in einen Befehl packen kann, also iwie so in der Art:

printf("%i",a=0); //gibt aber 0 und nicht a aus :/

eben, dass man die Operation, wie bei a--; erst im nachhinein ausführt.

Antwort
von spaghetticode, 29

Ich kann leider nur zur zweiten Frage beitragen. Meines Wissens geht das nicht; theoretisch wäre für sowas der Kommaoperator gedacht, aber die Funktion printf() würde ihn nicht als Kommaoperator erkennen, weil sie das Komma selbst als Trenner für ihre Argumente verwendet.

Keine passende Antwort gefunden?

Fragen Sie die Community