Hallo zusammen, ich habe in meinem Programm eine if- Anweisung die eine Variable auf nicht kleiner als überprüfen soll. Nach dem kompilieren bekomme ich folgende Warnung "warning: comparisons like X<=Y<=Z do not have their mathematical meaning". Der Code Ausschnitt sieht wie folgt aus. "if (! ( (0x01 <= *(data+2)) && (*(data+2) <= 0x7D) ))" Bedeutet es, dass der Controller die Funktion kleiner bzw größer als nicht unterstützt, oder habe ich einen falschen Syntax verwendet? Vielen Dank im Vorraus! Gruss Sebi
Ich sehe hier keinen Grund für diese Warnung. Ist das wirklich der richtige Ausschnitt?
Der Compiler will Dir damit sagen dass der "<="-Operator nicht transitiv ist. Aber bei obigen Code wird er das nicht erzeugen.
Der Codeauschnitt rechtfertigt die Meldung nicht. Bezieht sie sich absolut sicher auf deie gezeigte Zeile?
Deine Beshreibung
> die eine Variable auf nicht kleiner als überprüfen soll.
passt auch nicht auf diese Zeile. Die tut nämlich noch mehr.
Kommt eventuell auch drauf an was für Datentypen das sind, der Compiler und der Controller(?)... Sebastian Z. schrieb: > Bedeutet es, dass der Controller Unglaublich aber wahr: Nicht alle benutzen den Controller... eine Angabe kann hilfreich sein.. Alles in allem aber auch ein sehr undurchsichtiges Konstrukt, ich würde erstmal dies: *(data+2) in eine lokale Variable auslagern, dann spart man sich ein paar Klammern und der Ausdruck lässt sich schreiben als:
1 | x = *(data+2); |
2 | if (x > 0 && x < 126) { |
3 | //Tu was..
|
4 | }
|
Ist zwar nicht so "cool" wie mit 10 Klammern und Hexwerten dafür sieht man auch nach 10 Jahren noch was man damit aussagen wollte...
Sebastian Z. schrieb: > Bedeutet es, dass der Controller die Funktion kleiner bzw größer als > nicht unterstützt, oder habe ich einen falschen Syntax verwendet? Die Funktion "kleiner als" bzw "größer als" ist keine Funktion, sondern ein Operator. Und es ist schnurzegal, ob der Controller den Operator unterstützt. Der Compiler muß ihn unterstützen...
Hallo, wie oben schon geschrieben worden ist, geht es nicht um das "kleiner gleich" an sich, sondern darum, dass 3 Werte auf einmal verglichen werden. Der Compiler möchte also nicht "x <= y <= z", sondern "(x <= y) && (y <= z)". Solche Ausdrücke werden einzeln abgearbeitet. D. h. erst wird "x <= y" ausgewertet und das Ergebnis (Wahr od. Falsch) dann mit "z" verglichen. Und ein Ausdruck wie "Wahr <= z" entspricht nicht der mathematischen Idee von "y <= z". Carsten
Sebastian Z. schrieb: > "if (! ( (0x01 <= *(data+2)) && (*(data+2) <= 0x7D) ))" Läubi .. schrieb: > x = *(data+2); > if (x > 0 && x < 126) { Ein sehr schönes Beispiel, wie man kryptisch oder übersichtlich programmieren kann. Peter
Peter Dannegger schrieb: >> if (x > 0 && x < 126) { Ich neige dazu mehr zu Klammern. if ((x > 0) && (x < 126)) { Habs gern extra deutlich.
Abgesehen davon, daß es so nicht gleichbedeutend ist, finde ich jetzt eine Zwischenvariable auch nicht besser. Aber ist halt Geschmackssache, und eigentlich geht es hier nicht darum. Gibt es den TO eigentlich noch?
Vielen Dank. Konnte das Problem dank eurer Hilfe lösen.
Das ist wirklich schön für dich.. Vielleicht ein paar Details dazu. Was war den die Lösung?
guest schrieb: > Das ist wirklich schön für dich.. > > Vielleicht ein paar Details dazu. Was war den die Lösung? Wer lesen kann ist klar im Vorteil! Carsten schrieb: > Hallo, > > wie oben schon geschrieben worden ist, geht es nicht um das "kleiner > gleich" an sich, sondern darum, dass 3 Werte auf einmal verglichen > werden. Der Compiler möchte also nicht "x <= y <= z", sondern "(x <= y) > && (y <= z)". > > Solche Ausdrücke werden einzeln abgearbeitet. D. h. erst wird "x <= y" > ausgewertet und das Ergebnis (Wahr od. Falsch) dann mit "z" verglichen. > Und ein Ausdruck wie "Wahr <= z" entspricht nicht der mathematischen > Idee von "y <= z". > > Carsten PS: Ja ich weiß wie alt der hier ist, hatt es aber gerade offen und konnte es nicht lassen ;)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.