- LiFePO4 Speicher Test         
Ergebnis 1 bis 10 von 17

Thema: C Klammerung

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076

    C Klammerung

    Hallo zusammen, noch eine kurze Frage zum Wochenende

    Ich bin mal wieder auf die Nase gefallen und habe lange nach einem Fehler gesucht.
    Ich verstehe nicht wo der Unterschied zwischen diesen beiden Abfragen liegt, dass es mal geht und mal nicht.


    Code:
    int main(void)
    { int a,b,result;
    
      a = 0x01;
      b = 0x80;
      
      if (a & b == 0)   /* Bitweises UND, es müste 0 rauskommen */
      {
         result = TRUE;  
      } else
      {
        result = FALSE;    /* Ergebis ist aber FALSE */
      }
    
    
      a = -3;
      b = +3;
      if (a + b == 0)
      {
         result = TRUE;   /* Ergebnis ist TRUE, hier stimmt es */
      } else
      {
        result = FALSE;  
      }
    
    }
    Ich weis, (falsch: man hat mir gesagt) ich muss hier nochmal Klammern.
    if ((a & b) == 0)

    als alter Pascal Freak, ist das für mich natürlich überhaupt nicht einleuchtend, weil da brauche ich garkeine Klammern bei diesem simplen Gebilde

    Aber ich möchte einfach nur verstehen warum ich hier nochmals Klammern setzen muss.
    Eine if Abfrage muss generell in Klammern, okay ist halt so festgelegt, aber wozu die anderen Klammern.
    Bei der Addition funktioniert es ja auch ohne, bei dem Bitweisen UND nicht mehr.

    Dank Euch für Infos.
    Siro

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    28.09.2013
    Ort
    D
    Beiträge
    7
    Das hängt alles von der Abarbeitungsrichtung und der Rangordnung der Operatoren ab. Guck mal hier: http://manderc.manderby.com/operator...ator/index.php

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076
    Danke Dir erstmal für den Link:

    Verstanden hab ich es nicht wirklich.
    Die Abarbeitungsrichtung ist demnach von links nach rechts bei einem Bitweisen AND
    == hat den Rang 10
    & hat den Rang 4

    aber was sagt mir das jetzt ?

    wie dem auch sei:
    Laut Assembler Code hat mein Compiler result = FALSE daraus gemacht.
    Er hat die AND Funktion also garnicht erst ausgeführt.
    wie kommt er darauf, er weis dorch garnicht was rauskommt.

    es sei denn, er hat es wie folgt aufgelöst ?
    if (a & (b==0))

    wenn also b==0 ist, muss a zwangsläufig nach dem AND auch 0 sein und damit ist das Ergebnis des Vergleichs immer 0
    und deshalb erzeugt er nur den Code für result = FALSE

    Liege ich da ungefähr richtg ?

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    11.08.2008
    Ort
    Hallein
    Alter
    33
    Beiträge
    802
    Siehe Operator Precedence. == hat eine höhere Wertung als & und wird somit als erster evaluiert. Generell, weiß man es nicht, oder will sich nicht darauf verlassen, immer Klammern setzen. Schadet nie und schützt vor überraschenden Änderungen in der Zukunft, oder komischen Compilern.
    Kultuverein Metal Resurrection, für mehr Bands und Konzerte in Österreich (:

  5. #5
    Erfahrener Benutzer Roboter Genie Avatar von malthy
    Registriert seit
    19.04.2004
    Ort
    Oldenburg
    Beiträge
    1.379
    und "+" bindet seinerseits stärker als "==", deswegen das Ergebnis deiner zweiten Abfrage. Hätte ich jetzt auch nicht gewusst, insofern war's lehrreich .

  6. #6
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Obwohl man die Bindung oder Rangfolge der Operatoren bei Unsicherheit ja schnell mal nachschlagen kann setze ich trotzdem immer ein paar Klammern mehr, weil es die Lesbarkeit des Codes erhöht. Der Kompiler ignoriert überflüssige Klammern sowieso...

    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress