Hi, ist folgende C Zuweisung denkbar und was bewirkt sie? x = y,z;
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
Der Komma-Operator verwirft das, was links davon steht. x = y,z ist also dasselbe wie x = z.
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
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.
30 Jahre C und noch nie benutzt. Gibt es einen Anwendungsfall, wo man den Operator sinnvoll einsetzen könnte?
Sehr wenige. Aber generell ermöglicht er, zwei (bzw. n) Expressions auszuführen, wenn nur eine erlaubt ist.
for Schleife: for( int i= 0, char *cp=aString; i<10; i++, cp++) doSomething(i, cp); Mehrere "Komma"-Operatoren!
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++ ) ...
Danke für die Antworten. Habe also nichts verpasst und werde weiterhin gut ohne "," leben können.
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.
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".
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.
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.
Tony schrieb:
>Wenn z sowieso nicht übergeben wird, was bringt dann diese Anweisung?
Verwirrung des Gegners, Täuschen und Tarnen....
Gruß
Buna-Pelzer
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; |
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.