Operatory relacyjne i porównania języka C
Operatory relacji binarnych i równości porównują ich pierwszy argument do ich drugiego operandu, aby sprawdzić poprawność określonej relacji.Wynikiem wyrażenia relacyjnego jest 1, jeśli testowany związek ma wartość true i 0, jeśli ma wartość false.Typem wyniku jest int.
Składnia
relational-expression:
shift-expressionrelational-expression < shift-expression
relational-expression > shift-expression
relational-expression <= shift-expression
relational-expression >= shift-expression
equality-expression:
relational-expressionequality-expression == relational-expression
equality-expression != relational-expression
Operatory relacyjne i równości sprawdzają następujące relacje:
Operator |
Testowana relacja |
---|---|
< |
Pierwszy argument mniejszy niż drugi operand |
> |
Pierwszy operand większy niż drugi operand |
<= |
Pierwszy argument mniejszy lub równy drugiemu operandowi |
>= |
Pierwszy argument większy lub równy drugiemu operandowi |
== |
Pierwszy operand równy drugiemu operandowi |
!= |
Pierwszy operand nie równy drugiemu operandowi |
Pierwsze cztery operatory na powyższej liście mają wyższy priorytet niż operatory równości (== i !=).Zobacz informacje o pierwszeństwie w tabeli Pierwszeństwo i łączność operatorów C.
Operandy mogą mieć typ całkowity, zmiennoprzecinkowy lub wskaźnika.Typy operandów mogą być różne.Operatory relacyjne wykonują zwykłą konwersję arytmetyczną na operandach typu całkowitego i zmiennoprzecinkowego.Ponadto można użyć następujących kombinacji typów operandów z operatorami relacyjnymi i równości:
Oba operandy operatora relacyjnego lub równości mogą być wskaźnikami do tego samego typu.Dla operatorów równości (==) i nierówności (!=), wynik porównania wskazuje, czy dwa wskaźniki adresują tą samą lokalizację pamięci.Dla innych operatorów relacyjnych (<, >, <= i >=), wynik porównania wskazuje względną pozycję adresu pamięci dwóch wskazywanych obiektów.Operatory relacyjne porównują tylko przesunięcia.
Porównanie wskaźników jest zdefiniowane tylko dla części tego samego obiektu.Jeśli wskaźniki odnoszą się do elementów członkowskich tablicy, porównanie jest równoważne z porównaniem odpowiadających indeksów dolnych.Adres pierwszego elementu tablicy jest "mniejszy niż" adres ostatniego elementu.W przypadku struktur, wskaźniki do członków struktury zadeklarowanych później są wskaźnikami "większymi niż" od wskaźników do członków zadeklarowanych wcześniej w strukturze.Wskaźniki do członków tego samego union są równe.
Wartość wskaźnika można porównać do wartości stałej 0 dla równości (==) lub nierówności (!=).Wskaźnik o wartości 0 jest nazywany wskaźnikiem "null"; oznacza to, że nie wskazuje prawidłowej lokalizacji w pamięci.
Operatory równości są zgodne z regułami operatorów relacyjnych, ale zezwalają na dodatkowe możliwości: wskaźnik można porównać do wyrażenia stałej całkowitej z wartością 0 lub do wskaźnika void.Jeśli dwa wskaźniki są zerowe, porównywane są jako równe.Operatory równości porównują zarówno segment jak i przesunięcie.
Przykłady
Poniższe przykłady ilustrują operatory relacyjne i równości.
int x = 0, y = 0;
if ( x < y )
Ponieważ x i y są równe, wyrażenie w tym przykładzie zwraca wartość 0.
char array[10];
char *p;
for ( p = array; p < &array[10]; p++ )
*p = '\0';
Fragment w tym przykładzie ustawia każdy element array na stały znak null.
enum color { red, white, green } col;
.
.
.
if ( col == red )
.
.
.
Instrukcje te deklarują zmienną wyliczenia o nazwie col z tagiem color.W dowolnym momencie zmienna może zawierać wartość całkowitą 0, 1 lub 2, co przedstawia jeden z elementów zestawu wyliczenia color: kolor czerwony, biały lub zielony, odpowiednio.Jeśli col zawiera 0, gry instrukcja if jest wykonywana, wszelkie instrukcje zależne od if będą wykonane.