Namespaces
Variants

Comparison operators

From cppreference.net

Les opérateurs de comparaison sont des opérateurs binaires qui testent une condition et retournent 1 si cette condition est logiquement vraie et 0 si cette condition est fausse .

Opérateur Nom de l'opérateur Exemple Description
== égal à a == b a est égal à b
! = différent de a ! = b a est différent de b
< inférieur à a < b a est inférieur à b
> supérieur à a > b a est supérieur à b
<= inférieur ou égal à a <= b a est inférieur ou égal à b
>= supérieur ou égal à a >= b a est supérieur ou égal à b

Table des matières

Opérateurs relationnels

Les expressions d'opérateur relationnel ont la forme

lhs < rhs (1)
lhs > rhs (2)
lhs <= rhs (3)
lhs >= rhs (4)
1) expression less-than
2) expression supérieure à
3) expression inférieure ou égale
4) expression supérieure ou égale

lhs , rhs - expressions qui ont toutes deux un type réel ou toutes deux un type pointeur vers objet

Le type de toute expression d'opérateur relationnel est int , et sa valeur (qui n'est pas une lvalue) est 1 lorsque la relation spécifiée est vraie et 0 lorsque la relation spécifiée est fausse.

Si lhs et rhs sont des expressions de tout type réel , alors

  • usual arithmetic conversions sont effectuées
  • les valeurs des opérandes après conversion sont comparées selon le sens mathématique usuel (sauf que les zéros positifs et négatifs sont considérés comme égaux et toute comparaison impliquant une valeur NaN renvoie zéro)

Notez que les nombres complexes et imaginaires ne peuvent pas être comparés avec ces opérateurs.

Si lhs et rhs sont des expressions de type pointeur, elles doivent être toutes deux des pointeurs vers des objets de types compatibles , à l'exception des qualifications des objets pointés qui sont ignorées.

  • un pointeur vers un objet qui n'est pas un élément d'un tableau est traité comme s'il pointait vers un élément d'un tableau avec un seul élément
  • si deux pointeurs pointent vers le même objet, ou pointent tous deux juste après la fin du même tableau, ils sont considérés comme égaux
  • si deux pointeurs pointent vers différents éléments du même tableau, celui pointant vers l'élément avec l'indice le plus grand est considéré comme supérieur
  • si un pointeur pointe vers un élément d'un tableau et l'autre pointe juste après la fin du même tableau, le pointeur "juste après la fin" est considéré comme supérieur
  • si les deux pointeurs pointent vers des membres d'une même struct , le pointeur vers le membre déclaré plus tard dans la définition de la structure est considéré comme supérieur au pointeur vers le membre déclaré plus tôt
  • les pointeurs vers des membres d'une même union sont considérés comme égaux
  • toutes les autres comparaisons de pointeurs invoquent un comportement indéfini
#include <assert.h>
int main(void)
{
    assert(1 < 2);
    assert(2+2 <= 4.0); // int converts to double, two 4.0's compare equal
    struct { int x,y; } s;
    assert(&s.x < &s.y); // struct members compare in order of declaration
    double d = 0.0/0.0; // NaN
    assert( !(d < d) );
    assert( !(d > d) );
    assert( !(d <= d) );
    assert( !(d >= d) );
    assert( !(d == d) );
    float f = 0.1; // f = 0.100000001490116119384765625
    double g = 0.1; // g = 0.1000000000000000055511151231257827021181583404541015625
    assert(f > g); // different values
}

Opérateurs d'égalité

Les expressions d'opérateur d'égalité ont la forme

lhs == rhs (1)
lhs != rhs (2)
1) expression égal-à
2) expression de non-égalité

lhs , rhs - expressions qui
(depuis C23)
  • sont toutes deux des pointeurs vers des objets ou fonctions de types compatibles , en ignorant les qualificatifs des types pointés
  • l'une est un pointeur vers un objet et l'autre est un pointeur vers void (éventuellement qualifié)
  • l'une est un pointeur vers un objet ou une fonction et l'autre est une constante de pointeur nul telle que NULL ou nullptr (depuis C23)

Le type de toute expression d'opérateur d'égalité est int , et sa valeur (qui n'est pas une lvalue) est 1 lorsque la relation spécifiée est vraie et 0 lorsque la relation spécifiée n'est pas vraie.

  • si les deux opérandes ont des types arithmétiques, les conversions arithmétiques usuelles sont effectuées et les valeurs résultantes sont comparées selon le sens mathématique usuel (sauf que les zéros positifs et négatifs sont considérés comme égaux et toute comparaison impliquant une valeur NaN, y compris l'égalité avec elle-même, retourne zéro). En particulier, les valeurs de type complexe sont égales si leurs parties réelles sont égales et leurs parties imaginaires sont égales.
(depuis C23)
  • si un opérande est un pointeur et l'autre est une constante de pointeur nul, la constante de pointeur nul est d'abord convertie vers le type du pointeur (ce qui donne une valeur de pointeur nul), et les deux pointeurs sont comparés comme décrit ci-dessous
  • si un opérande est un pointeur et l'autre est un pointeur vers void, le pointeur non-void est converti en pointeur vers void et les deux pointeurs sont comparés comme décrit ci-dessous
  • deux pointeurs sont égaux si l'une des conditions suivantes est vraie :
  • ils sont tous deux des valeurs de pointeur nul de leur type
  • ils sont tous deux des pointeurs vers le même objet ou fonction
  • un pointeur pointe vers un objet struct/union/tableau et l'autre vers son premier membre/n'importe quel membre/premier élément
  • ils pointent tous deux juste après le dernier élément du même tableau
  • l'un pointe juste après la fin d'un tableau, et l'autre au début d'un tableau différent (du même type) qui suit le premier dans un tableau plus grand ou dans une struct sans remplissage

(comme avec les opérateurs relationnels, les pointeurs vers des objets qui ne sont pas des éléments d'un tableau se comportent comme des pointeurs vers des éléments de tableaux de taille 1)

Notes

Les objets de type struct ne se comparent pas automatiquement comme égaux, et leur comparaison avec memcmp n'est pas fiable car les octets de remplissage peuvent avoir n'importe quelle valeur.

Parce que la comparaison de pointeurs fonctionne avec les pointeurs vers void, la macro NULL peut être définie comme ( void * ) 0 en C, bien que cela serait invalide en C++ où les pointeurs void ne se convertissent pas implicitement en pointeurs typés

Il faut prendre des précautions lors de la comparaison de valeurs à virgule flottante pour l'égalité, car les résultats de nombreuses opérations ne peuvent pas être représentés exactement et doivent être arrondis. En pratique, les nombres à virgule flottante sont généralement comparés en permettant une différence d'une ou plusieurs unités de la dernière place.

#include <assert.h>
int main(void)
{
    assert(2+2 == 4.0); // int converts to double, two 4.0's compare equal
    int n[2][3] = {1,2,3,4,5,6};
    int* p1 = &n[0][2]; // last element in the first row
    int* p2 = &n[1][0]; // start of second row
    assert(p1+1 == p2); // compare equal
    double d = 0.0/0.0; // NaN
    assert( d != d ); // NaN does not equal itself
    float f = 0.1; // f = 0.100000001490116119384765625
    double g = 0.1; // g = 0.1000000000000000055511151231257827021181583404541015625
    assert(f != g); // different values
}

Références

  • Norme C17 (ISO/CEI 9899:2018) :
  • 6.5.8 Opérateurs relationnels (p: 68-69)
  • 6.5.9 Opérateurs d'égalité (p: 69-70)
  • Norme C11 (ISO/CEI 9899:2011) :
  • 6.5.8 Opérateurs relationnels (p: 95-96)
  • 6.5.9 Opérateurs d'égalité (p: 96-97)
  • Norme C99 (ISO/CEI 9899:1999) :
  • 6.5.8 Opérateurs relationnels (p : 85-86)
  • 6.5.9 Opérateurs d'égalité (p : 86-87)
  • Norme C89/C90 (ISO/CEI 9899:1990) :
  • 3.3.8 Opérateurs relationnels
  • 3.3.9 Opérateurs d'égalité

Voir aussi

Priorité des opérateurs

Opérateurs courants
affectation incrémentation
décrémentation
arithmétique logique comparaison accès membre autres

a = b
a + = b
a - = b
a * = b
a / = b
a % = b
a & = b
a | = b
a ^ = b
a <<= b
a >>= b

++ a
-- a
a ++
a --

+ a
- a
a + b
a - b
a * b
a / b
a % b
~a
a & b
a | b
a ^ b
a << b
a >> b

! a
a && b
a || b

a == b
a ! = b
a < b
a > b
a <= b
a >= b

a [ b ]
* a
& a
a - > b
a. b

a ( ... )
a, b
( type ) a
a ? b : c
sizeof


_Alignof
(depuis C11)
(jusqu'à C23)

alignof
(depuis C23)

Documentation C++ pour Opérateurs de comparaison