Forum: PC-Programmierung ODER || in c


von Pete (Gast)


Lesenswert?

Funktioniert das in c(nicht c++)

if (r * 8 > 32768 || r * 8 < -32768)
{

}

als

WENN r  8 GRÖßER ALS 32768 ODER r  8 KLEINER ALS -32768

oder heißt das || in c etwas anderes?

von Pete (Gast)


Lesenswert?

Dumme Formatierung. Soll heißen

WENN r MAL 8 GRÖßER ALS 32768 ODER r MAL 8 KLEINER ALS -32768

von Marius W. (mw1987)


Lesenswert?

Das ist einfach nur Augenkrebs. Ich hab jetzt keine Lust die Reihenfolge 
der Operatoren auszutüfteln. Der liebe Gott hat runde Klammern erfunden 
also NUTZE sie auch.

Gruß
Marius

von Rufus Τ. F. (rufus) Benutzerseite


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.

von Michael G. (mjgraf)


Lesenswert?

Welchen Typ hat denn r?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von Dennis H. (c-logic) Benutzerseite


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.

von Rolf Magnus (Gast)


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))

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Hmm.


> if ((r > 32768 / 8)

Wenn tatsächlich mit 32768 gearbeitet werden soll (mit int16_t nicht 
darstellbar), dann ist die Aufgabenstellung natürlich trivial, da das 
ein glatter Bruch ist. Und damit reduziert sich die Betrachtung auf
1
if ((r > 4096) || (r < -4096))

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Rufus Τ. Firefly schrieb:
>> if ((r > 32768 / 8)
>
> Wenn tatsächlich mit 32768 gearbeitet werden soll (mit int16_t nicht
> darstellbar),

Na und? Wenn es nicht in rein passt wird eben der nächst größere Typ 
genommen.  in
1
long l = 65536;

ist l 65536 und nicht 0, auch wenn int nur 16 Bits hat.

von Stefan F. (Gast)


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.

von Karl H. (kbuchegg)


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.

: Bearbeitet durch User
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Karl Heinz schrieb:
> sondern die Formulierung  r > 32768 / 8
> wahrscheinlich bevorzugen würde.

Eben:

> Und damit reduziert sich die Betrachtung auf
> if ((r > 4096) || (r < -4096))

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
Noch kein Account? Hier anmelden.