ODER || in c

Persönliche Seite #3375499
Lesenswert?

Rumschreien (Versalien, also alles in Großbuchstaben) hilft nicht.


Sieh Dir die Operatorenvorrangregeln an, oder klammere Deine Ausdrücke. 
Sag dem Compiler, was Du erreichen willst.
1
if ((r * 8 > 32768) || (r * 8 < -32768))

Ansonsten hängt das davon ab, wie groß ein int auf Deinem System ist, 
und welchen Datentyp r hat.

Zur Sicherheit solltest Du die Konstanten als long kennzeichnen:
1
if ((r * 8 > 32768L) || (r * 8 < -32768L))

Auf einem 16-Bit-System ist 32768 nicht mit einem int darstellbar, der 
Wertebereich geht von -32768 bis +32767.
Moderator Persönliche Seite #3375581
Lesenswert?

Marius Wensing schrieb:
> Der liebe Gott hat runde Klammern erfunden also NUTZE sie auch.

Geschmackssache.  Man kann sich auch merken, dass Vergleiche in C
einen höheren Vorrang haben als logische Verknüpfungen, eben weil
es gewollt ist, dass
1
  if (a > b && a < c) {
2
    // ...
3
  }

so funktioniert, wie man es erwarten würde.

In Pascal geht es übrigens nicht ohne Klammern ab.

Ansonsten ist das eine Frage, wie groß der Wertebereich des Typs "int"
auf der Zielplattform ist, ob das Ganze so funktioniert, wie man es
erwarten würde.
Persönliche Seite #3375645
Lesenswert?

Abendgedanken.

Marius Wensing schrieb:
> Der liebe Gott hat runde Klammern erfunden also NUTZE sie auch.

Das glaub ich so nicht ganz.

Kontra:
Der graue Alte hat nix erfunden, er hats hervorgezaubert.
Dieser Umstand schränkt die Patentierbarkeit auch deutlich ein.
Der Mensch kann etwas erfinden, vorallem wegen der fehlenden Fähigkeit 
im Zaubern und weil der Mensch auch recht gut im Kopieren natürlicher 
Begebenheiten ist.

Pro:
Allerdings beschreibt der Reiseführer des alten Grauen ein notwendiges 
Ausklammern anderer Reisegruppen.
Gast #3375948
Lesenswert?

Rufus Τ. Firefly schrieb:
> Zur Sicherheit solltest Du die Konstanten als long kennzeichnen:
> if ((r * 8 > 32768L) || (r * 8 < -32768L))

Das bringt nichts. Wenn r vom Typ int ist, ist r * 8 auch ein int. Erst 
danach wird dann erweiteret auf long, weil rechts ein long steht. Da 
ist's aber schon zu spät. Also wenn, dann:
1
if ((r * 8L > 32768) || (r * 8L < -32768))

oder das gleich ganz umgehen und einfach:
1
if ((r > 32768 / 8) || (r < -32768 / 8))
Gast #3378785
Lesenswert?

@Pete:
Während sich die C Urgesteine in die Details ihrer Programmiersprache 
vertiefen....

Ist denn Deine Frage beantwortet?

Fall nicht: Der Ausdruck ist wahr, wenn nur der linke, nur der rechte 
oder beide Vergleiche zutreffen. Du hast das schon richtig verstanden.
#3378803
Lesenswert?

Na ja.
Seine Frage zielte eigentlich darauf hin ab, sicher zu gehen, dass || in 
C ein logisches Oder ist.
Da man das in jedem noch so grindigem C-Buch nachlesen kann, kann man 
auf die Idee kommen, dass sein eigentliches Problem nicht in der 
Bedeutung des || zu suchen ist, sondern in der Fragestellung, warum 
dieser Vergleich bei bekanntem Wert von r nicht wie erwartet 
funktioniert. Und dann ist der Schritt hin zu falschen Ergebnissen 
aufgrund von Overflows nicht mehr sehr weit. Zumal das Wissen darüber im 
Regelfall wesentlich weniger umfangreich ist, als das Wissen darüber 
welche Operation ein || eigentlich darstellt.
Zumal jemand, der über die Overflow-Problematik Bescheid weiß, eher 
selten
1
   r * 8 > 32768
schreiben würde, sondern die Formulierung
1
  r > 32768 / 8
wahrscheinlich bevorzugen würde.

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