Hallo, habe ein C-Verständnis Problem. Bin mir nicht Sicher ob meine C-Sytax fehlerhaft ist, oder ob der Compiler einen Fehler macht? Mir ist nicht klar warum unten stehender "auskommentierter Code" nicht zum gleichen Ergebnis führt, wie der "Workaround" ? // *** Defines #define FALSE 0 #define TRUE !FALSE #define flag unsigned char // fVariable #define uchar unsigned char // ucVariable //////////////////////////////////////////////////////////////////// flag fIO_OutputHighActive=FALSE; flag ucStatus =FALSE; . . . /* So funktioniert es nicht ??? if (fIO_OutputHighActive) ucStatus != ucStatus; */ // Workaround: So funktioniert es.. if (ucStatus) { if (! fIO_OutputHighActive) ucStatus = FALSE; } else { if (! fIO_OutputHighActive) ucStatus = TRUE; } . . . if (ucStatus) // Setzen, SET, TRUE vSetPort(); else // Rücksetzen, CLEAR, RESET, FALSE vClearPort();
!= ist keine Zuweisung sondern ein Vergleich, also das (negierte) Äquivalent zu ==. Was Du folglich machen willst, ist ein ucStatus = !ucStatus;
@Programmierer: Um die Variable bitweise zu invertieren, muß es heißen: ucStatus = ~ucStatus; Das Zeichen "!" geht nur bei Vergleichsoperationen, jedoch nicht bei Zuweisungen. Gruß Dietmar
@Dietmar: Komisch, dass bei mir "irgendwas = !irgendwas" immer klappt und den erwünschten Effekt (togglen von true (d.h. ungleich 0) und false (d.h. gleich 0)) hat.
Man kann auch ! bei Zuweisungen benutzen, wird aber selten gemacht, da es ein logischer Operator ist d.h kein bitweiser Operator. ! macht aus dem Wert 0 eine 1, alle andere Werte werden zu 0. Es macht also etwas völlig anderes als das ~ Peter
@Christian: Habe solche Zuweisung wie: ucStatus != ucStatus; bisher nirgends gesehen, und ich wühle mich sehr oft durch fremde Software, Beispielcodes, usw.. Und, warum geht es nicht??? Habe den Ausdruck i != i gerade in Keil µVision getestet, mit verschiedenen Werten vorinitialisiert, da tut sich absolut nichts, die Variable bleibt unverändert. Gruß Dietmar
ja, anscheinend existiert aber die Meinung, man könne mit diesem Ausdruck was zuweisen... Gruß Dietmar
Nochmal: Man beachte den feinen Unterschied: ucStatus != ucStatus; --> geht nicht! ucStatus = !ucStatus; --> invertiert nur das unterste bit! ucStatus = ~ucStatus; --> invertiert bitweise! Ist vielleicht schon etwas spät :-) Gruß Dietmar
> ucStatus = !ucStatus; --> invertiert nur das unterste bit!
Nein. Definitiv nicht; das würde aus einer 2 eine 3 machen.
Tut es aber nicht, es macht aus 'ner 2 'ne 0.
ja ja ja, ist doch schon spät :-) macht aus allen Werten eine 0, und macht aus der 0 eine 1. Ists jetzt richtig? Gruß Dietmar
@Dietmar: "Habe solche Zuweisung wie: ucStatus != ucStatus; bisher nirgends gesehen" Ist keine Zuweisung, sondern ein Vergleich, dessen Ergebnis nicht weiter verwendet wird. Dieses Ergebnis könntest Du auch zuweisen: erg = ucStatus != ucStatus; erg ist dann entweder true oder false. In C ist es etwas gewöhnungsbedürftig, dass - Zuweisungen auch wiederum ein Ergebnis haben (a = b = c = 0) oder Deshalb ist der der Ausdruck if (erg=123){....}; syntaktisch korrekt, trotzdem er ganz was anderes macht, als man erwartet (erg==123), nämlich: 123 ist immer true. - Ergebnisse nicht zugewiesen werden müssen: int a=123; a; sollte ebenfalls syntaktisch in Ordnung sein. a "hängt einfach in der Luft" und es passiert nichts.
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.