2016-06-17 9 views
3

Ich frage mich nur wie funktioniert Grenzprüfung im folgenden Fall funktioniert.herauszufinden integer Vergleich in C

#include <stdio.h> 
#include <stdint.h> 

int main(void) 
{ 
    for (int i = 0; i < 3; ++i) { 
     for (int j = 0; j < 3; ++j) { 
      for (int x = 0; x < 3; x++) { 
       printf("%d < %d < %d is %d\n", i, x, j, i < x < j); 
      } 
     } 
    } 
    return 0; 
} 

Ich habe versucht, von rechts nach links/links-nach-rechts Vorrang, aber es scheint nicht zu funktionieren. (Nicht sicher, ob es aber vielleicht doch?)

Ich denke, das nicht definiertes Verhalten ist und mit & & wahrscheinlich einfacher sein, wäre dies als herauszufinden, aber ich bin ziemlich interessiert, wie die Logik dahinter funktioniert. Wäre dankbar, wenn jemand das erklären oder mich in die richtige Richtung

bearbeiten Punkt helfen könnte: Hey Leute! Danke für die Hilfe! bekam die Antwort, die ich brauchte. Das muss Ihnen allen völlig trivial erscheinen, aber es hat wirklich viele Dinge gebracht, über die ich in den letzten Tagen nachgedacht habe. Ich schätze die Zeit, die ihr mir genommen habt, um mir zu helfen. Danke noch einmal!

+0

http://en.cppreference.com/w/c/language/operator_precedence sagt er nach rechts – tkausl

+1

bleibt, ist nicht der irreführende Titel? Was haben Integer-Grenzen damit zu tun? – SilentMonk

+0

Ich lese es als "Wie überprüfen Sie, ob eine Ganzzahl x zwischen i und j ist". – Bathsheba

Antwort

3

i < x < j ist perfekt gut definiert, aber es tut nicht das, was Sie denken, es tut.

Es entspricht (i < x) < j, aufgrund der Assoziativität von <.

Aber (i < x) ist entweder 0 oder 1, wie das ist, wie die relationalen Operatoren in C.

So zum Beispiel definiert werden, wenn j größer als 1 ist, dann i < x < j ist immer 1.

Schreiben Sie stattdessen i < x && x < j.

+0

ahh !! Das macht Sinn. Vielen Dank! – David