Forum: PC-Programmierung C Zuweisung ?


von fuzzi (Gast)


Lesenswert?

Hi,
ist folgende C Zuweisung denkbar und was bewirkt sie?

x = y,z;

von Peter II (Gast)


Lesenswert?

fuzzi schrieb:
> ist folgende C Zuweisung denkbar und was bewirkt sie?

suche mal nach kommaoperator

von Guest (Gast)


Lesenswert?

Ich schätze mal du meinst sowas
1
int x = 10;
2
int z = x,y;
Dann wird z mit x initialisiert und y als Integer Variable deklariert

von Sven B. (scummos)


Lesenswert?

Der Komma-Operator verwirft das, was links davon steht. x = y,z ist also 
dasselbe wie x = z.

von Stefan E. (sternst)


Lesenswert?

Sven B. schrieb:
> x = y,z ist also
> dasselbe wie x = z.

Nein, denn die Zuweisung bindet stärker, als der Komma-Operator. Die 
Schreibweise im Beispiel täuscht da, sinnvoller sähe es so aus
x=y , z

von Sven B. (scummos)


Lesenswert?

Oh. Hups. Hab's getestet, das stimmt.

von Arc N. (arc)


Lesenswert?

Sven B. schrieb:
> Der Komma-Operator verwirft das, was links davon steht. x = y,z ist also
> dasselbe wie x = z.

Jein. S.o. und 1) wird beides ausgeführt ("gewünschter" Seiteneffekt) 2) 
ist das Komma ein Sequenzpunkt d.h. der Compiler darf da bspw. nicht 
umsortieren, wenn er optimieren will.

von Auha (Gast)


Lesenswert?

30 Jahre C und noch nie benutzt. Gibt es einen Anwendungsfall, wo man 
den Operator sinnvoll einsetzen könnte?

von Sven B. (scummos)


Lesenswert?

Sehr wenige. Aber generell ermöglicht er, zwei (bzw. n) Expressions 
auszuführen, wenn nur eine erlaubt ist.

von Ccccc (Gast)


Lesenswert?

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

von Klaus W. (mfgkw)


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++ ) ...

von Auha (Gast)


Lesenswert?

Danke für die Antworten. Habe also nichts verpasst und werde weiterhin 
gut ohne "," leben können.

von Sven B. (scummos)


Lesenswert?

Ja, definitiv. Nur für die Schleifen ist es manchmal praktisch.

von Auha (Gast)


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.

von Sven B. (scummos)


Lesenswert?

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".

von Auha (Gast)


Lesenswert?

Gut. Was kommt denn raus?

von Auha (Gast)


Lesenswert?

int a,b;

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

Hat hier die Anordnung auch keine Auswirkung? Ich finde, das Ganze ist 
nicht zu warten.

von Sven B. (scummos)


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.

von Tony (Gast)


Lesenswert?

x = y,z

Wenn z sowieso nicht übergeben wird, was bringt dann diese Anweisung?

von Buna-Pelzer (Gast)


Lesenswert?

Tony schrieb:
>Wenn z sowieso nicht übergeben wird, was bringt dann diese Anweisung?

Verwirrung des Gegners, Täuschen und Tarnen....

Gruß
Buna-Pelzer

von Tony (Gast)


Lesenswert?

Jetzt ernsthaft! Wird der Compiler da irgendwas draua ableiten?

von Rolf M. (rmagnus)


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;

von Thomas K. (muetze1)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.