C-Compiler Fehler ???

Gast #335101
Lesenswert?

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();
Gast #335105
Lesenswert?

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
Gast #335106
Lesenswert?

@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
Gast #335109
Lesenswert?

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
Gast #335113
Lesenswert?

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

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