Du bist nicht angemeldet.

Lieber Besucher, herzlich willkommen bei: OS X Entwicklerforum. Falls dies dein erster Besuch auf dieser Seite ist, lies bitte die Hilfe durch. Dort wird dir die Bedienung dieser Seite näher erläutert. Darüber hinaus solltest du dich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutze das Registrierungsformular, um dich zu registrieren oder informiere dich ausführlich über den Registrierungsvorgang. Falls du dich bereits zu einem früheren Zeitpunkt registriert hast, kannst du dich hier anmelden.

1

Montag, 7. Mai 2012, 16:36

Reihefolge logischer Operatoren

Moin,

ich hab hier nen Codefetzen rumliegen und so ein paar Erinnerungsprobleme, was die C-Standards angeht.
Wenn mir jemand nen Schubs auf den Standard geben kann bin ich sehr dankbar. :)

Also akut meckert mein LLVM bei folgendem Vergleich folgerichtig:

C/C++-Quelltext

1
2
if( var>3 && var<=3 || count[i]>count[j] || count[i]==count[j] && var[i]<var[j] )
...

Zitat von »LLVM«

Semantic issue: '&&' within '||'


Weiterhin schlägt er mir vor, sämtliche && einfach in Klammern zu setzen.
Daraus schließe ich und glaube mich zu erinnern, dass bei logischen Operatoren erst die UND-Operatoren und dann die ODER-Operatoren ausgewertet werden.

C/C++-Quelltext

1
2
if( (var>3 && var<=3) || count[i]>count[j] || (count[i]==count[j] && var[i]<var[j]) )
...


Kann jemand meine Vermutung gegebenenfalls mit einem Link zur Spezifikation belegen?
Irgendwie bin ich zu unfähig, dahingehend Google zu benutzen.
Hilfreich? Dann freue ich mich über eine kleine Spende. :) Flattr this
----
«Applejack» "Don't you use your fancy mathematics to muddle the issue!"
----

Beiträge: 19 427

Wohnort: Köln

Beruf: Rechtsanwalt

Hobbys: FSK18

  • Private Nachricht senden

2

Montag, 7. Mai 2012, 16:43

1. Du hast Recht. UND ist wie Multiplikation, ODER ist wie Addition. (Stell dirZahlenwerte 0 und 1 als boolsche Werte vor.)

2. Du musst nach Operator Priority googlen.
http://de.wikibooks.org/wiki/C-Programmi…_nach_Priorität

&& hat 5, || hat 4

Da findest du übrigens auch den Rest deiner Operatoren (Gleichheit undExklusiv-Oder)
Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
verhindert man die Leaks, so verhindert man auch die Begrenzung auf 128 Abfragen

3

Montag, 7. Mai 2012, 16:52

Danke. :)
Hilfreich? Dann freue ich mich über eine kleine Spende. :) Flattr this
----
«Applejack» "Don't you use your fancy mathematics to muddle the issue!"
----

Beiträge: 377

Wohnort: Donauwörth

Beruf: Project Lead Engineer - Advanced Security Team

  • Private Nachricht senden

4

Mittwoch, 9. Mai 2012, 08:56

Als Merkhilfe:
- das logische UND (&&) entspricht einer Multiplikation (beide wahr ergibt wahr, sonst falsch - entspricht ein Produkt ist 0 wenn einer der Faktoren 0 ist).
- das logische ODER (||) entspricht einer Addition (beide falsch ergibt falsch, sonst wahr - entspricht eine Summe ist nicht 0, wenn ein Summand nicht 0 ist).

Dann ergibt sich aus "Punkt vor Strich" die Tatsache das der Ausdruck ohne die Klammern immer so ausgewertet wird, als wäre um die && Ausrücke eine Klammer - und clang empfiehlt dir, diese Klammern auch im Code zu setzen, a) damit deine Absicht eindeutig erkennbar ist und b) du prüfen kannst, ob das wirklich deine Absicht ist.

Allerdings glaube ich, dass genau das nicht deine Absicht ist - da der Ausdruck "var>3 && var<=3" immer falsch ist, da eine Variable ja nicht gleichzeitig größer 3 und kleiner gleich 3 sein kann. Damit ist dieser Ausdruck immer falsch und clang wird den sogar beim Optimieren wegschmeißen. Ist doch nett von clang, dass er dir mitteilt, dass dieser Ausdruck den Eindruck erweckt, als könnte er nicht das bezwecken, was du wolltest...

5

Mittwoch, 9. Mai 2012, 10:21

Allerdings glaube ich, dass genau das nicht deine Absicht ist - da der Ausdruck "var>3 && var<=3" immer falsch ist, da eine Variable ja nicht gleichzeitig größer 3 und kleiner gleich 3 sein kann. Damit ist dieser Ausdruck immer falsch und clang wird den sogar beim Optimieren wegschmeißen. Ist doch nett von clang, dass er dir mitteilt, dass dieser Ausdruck den Eindruck erweckt, als könnte er nicht das bezwecken, was du wolltest...

Irgendwie ist da bei CnC was untergegangen...

C/C++-Quelltext

1
if(var[i]>3&&var[j]<=3||count[i]>count[j]||count[i]==count[j]&&var[i]<var[j]){



Anyways. Meine Absicht war, Warnungen loszuwerden ohne sie zu unterdrücken. Es handelt sich in dem Fall eigentlich um ein PAL. (Problem Anderer Leute)
Allerdings nervt dieses PAL mich mehr als besagte AL. ^^
Hilfreich? Dann freue ich mich über eine kleine Spende. :) Flattr this
----
«Applejack» "Don't you use your fancy mathematics to muddle the issue!"
----

Social Bookmarks