Gast
#2998347
Hi, ist folgende C Zuweisung denkbar und was bewirkt sie? x = y,z;
|
Anzeige
|
C Zuweisung ?
Gast
#2998347
Hi, ist folgende C Zuweisung denkbar und was bewirkt sie? x = y,z;
Gast
#2998351
fuzzi schrieb: > ist folgende C Zuweisung denkbar und was bewirkt sie? suche mal nach kommaoperator
Gast
#2998542
Ich schätze mal du meinst sowas
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 Oh. Hups. Hab's getestet, das stimmt. 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.
Gast
#2998646
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.
Gast
#2998658
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++ ) ...
Gast
#2998751
Danke für die Antworten. Habe also nichts verpasst und werde weiterhin gut ohne "," leben können. Ja, definitiv. Nur für die Schleifen ist es manchmal praktisch.
Gast
#2998793
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".
Gast
#2998801
Gut. Was kommt denn raus?
Gast
#2998806
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.
Gast
#3001764
x = y,z Wenn z sowieso nicht übergeben wird, was bringt dann diese Anweisung?
Gast
#3001775
Tony schrieb:
>Wenn z sowieso nicht übergeben wird, was bringt dann diese Anweisung?
Verwirrung des Gegners, Täuschen und Tarnen....
Gruß
Buna-Pelzer
Gast
#3001871
Jetzt ernsthaft! Wird der Compiler da irgendwas draua ableiten? 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:
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 schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|