The relational operators group left-to-right.

relational-expression:The lvalue-to-rvalue ([conv.lval]), array-to-pointer ([conv.array]), and function-to-pointer ([conv.func]) standard conversions are performed on the operands.compare-expressionrelational-expression<compare-expressionrelational-expression>compare-expressionrelational-expression<=compare-expressionrelational-expression>=compare-expression

The comparison is deprecated if
both operands were of array type
prior to these conversions ([depr.array.comp]).

The converted operands shall have arithmetic, enumeration, or pointer type.

The
operators < (less than), > (greater than), <=
(less than or equal to), and >= (greater than or equal to) all
yield false or true.

The type of the result is
bool.

The usual arithmetic conversions are performed on operands of arithmetic
or enumeration type.

If both operands are pointers, pointer
conversions and qualification conversions
are performed to bring
them to their composite pointer type.

After conversions, the operands shall have the same type.

The result of comparing unequal pointers to objects87
is defined in terms of a partial order consistent with the following rules:

- If two pointers point to different elements of the same array, or to subobjects thereof, the pointer to the element with the higher subscript is required to compare greater.
- If two pointers point to different non-static data members of the same object, or to subobjects of such members, recursively, the pointer to the later declared member is required to compare greater provided the two members have the same access control ([class.access]), neither member is a subobject of zero size, and their class is not a union.
- Otherwise, neither pointer is required to compare greater than the other.

If two operands p and q compare equal,
p<=q and p>=q both yield true and p<q and
p>q both yield false.

Otherwise, if a pointer p
compares greater than a pointer q, p>=q, p>q,
q<=p, and q<p all yield true and p<=q,
p<q, q>=p, and q>p all yield false.

Otherwise, the result of each of the operators is unspecified.

If both operands (after conversions) are of arithmetic or enumeration type, each
of the operators shall yield true if the specified relationship is true
and false if it is false.

An object that is not an array element is considered to belong to a
single-element array for this purpose; see [expr.unary.op].

A pointer past the last element of an array x of n elements
is considered to be equivalent to a pointer to a hypothetical element
x[n] for this purpose; see [basic.compound].