C Zuweisung ?

#2998672
Lesenswert?

Z.B. wenn man irgendwo  mehrere Sachen machen muß, aber formal nur einen 
Ausdruck nehmen darf (if-Bedingung oder ein Makro, von dem man nicht 
weiß wo es überall verwendet wird).
Noch relativ häufig sieht man es , wenn in einem for mehrere 
Reinitialisierungen nötig sind: for(irgendwas;blabla; i++, j++ ) ...
Gast #2998793
Lesenswert?

int a,b;

for(a=0,b=0;a<10;a++,b++)
   ;
printf("%d %d",a,b);

oder

int a,b;

for(a=0,b=0;a<10;++a,b++)
   ;
printf("%d %d",a,b);

Wie sieht die Ausgabe für die beien Fälle aus. Weiss das jemand auf 
Anhieb? Natürlich kann ich das mit Hilfe von KR lösen, nur bin ich mir 
sicher ob der Kompiler das genauso macht? Nene, nix für mich.
#2998811
Lesenswert?

10, 10 kommt raus, weil natürlich immer beide Anweisungen ausgeführt 
werden, und nicht nur eine. Wieso sollte der Compiler nur das erste 
ausführen, und dann das zweite nicht mehr...
Abgesehen davon finde ich das echt nicht so unpraktisch, manchmal ist 
das schon sinnvoll. Man muss es ja nicht so obskur verbauen.
#3001921
Lesenswert?

Sven B. schrieb:
> Dieser a++ / ++a Mythos für die for-Schleife ist ziemlich hartnäckig. Es
> ist völlig egal, ob man in der for-Schleife a++ oder ++a schreibt.

In C++ kann es einen Unterschied machen, wenn a eine Instanz einer 
Klasse ist und a++ und ++a die entsprechenden Operatoren dieser Klasse 
aufrufen.

Tony schrieb:
> Jetzt ernsthaft! Wird der Compiler da irgendwas draua ableiten?

Ungefähr das gleiche wie aus einem:
1
z;
#3001951
Lesenswert?

Ccccc schrieb:
> for Schleife:
> for( int i= 0, char *cp=aString; i<10; i++, cp++)
>           doSomething(i, cp);
> Mehrere "Komma"-Operatoren!

Jo, aber den Initialisierungsteil kannst du vergessen, da du keinen 
Integer namens "char" anlegen kannst. Im Initialisierungsabschnitt 
würdest du mit dem Komma in deinem Beispiel höchstens weitere Integer 
definieren. Andere Typen nicht (d.h. das Beispiel würde nicht klappen).

Sven B. schrieb:
> Dieser a++ / ++a Mythos für die for-Schleife ist ziemlich hartnäckig. Es
> ist völlig egal, ob man in der for-Schleife a++ oder ++a schreibt. Das
> spielt nur eine Rolle, wenn man sowas macht wie "a++ > 0" oder "++a >
> 0".

Bevor es im einem C Standard mal so definiert wurde, gab es da 
Handlungsspielraum. Zum Beispiel hat Turbo C v1.0 auf dem Atari ST 
damals das exakt so unterschieden und das Inkrement entweder am Anfang 
bzw. am Ende des Schleifendurchlaufs inkrementiert. Irgend einen anderen 
Compiler, welcher nicht von Borland/CodeGear/Inprise/Embarcadero war, 
hatte das in der "alten" Zeit auch so unterschieden. Aber ich kann dir 
auf Anhieb nicht mehr sagen, welcher das war.

Rolf Magnus schrieb:
> In C++ kann es einen Unterschied machen, wenn a eine Instanz einer
> Klasse ist und a++ und ++a die entsprechenden Operatoren dieser Klasse
> aufrufen.

Ja, z.B. bei den Template Klassen (STL) ist es ein Unterschied. Der 
postincrement muss den aktuellen Wert vor der Inkrementation zurück 
geben. Damit muss der aktuelle Wert an eine temporäre Stelle kopiert 
werden (und sei es nur im Register). Dieser Nachteil geht aber abhängig 
von der Implementation der STL meist gen 0. Aber es gibt bestimmt auch 
Fälle, wo der Iterator etwas komplexer ausfällt bzw. vor allem durch die 
Ausprägung des verwalteten Typs kann sich dort ein deutlicher 
Mehraufwand (Objektkopie) ergeben.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren