天天看点

GCC Operator Extension

6.1 Minimum and Maximum Operators in C++

It is very convenient to have operators which return the “minimum” or the “maximum” of two arguments. In GNU C++ (but not in GNU C),

a

<?

b
is the minimum, returning the smaller of the numeric values a and b;
a

>?

b
is the maximum, returning the larger of the numeric values a and b.

These operations are not primitive in ordinary C++, since you can use a macro to return the minimum of two things in C++, as in the following example.

#define MIN(X,Y) ((X) < (Y) ? : (X) : (Y))
      

You might then use `int min = MIN (i, j);' to set min to the minimum value of variables i and j.

However, side effects in

X

or

Y

may cause unintended behavior. For example,

MIN (i++, j++)

will fail, incrementing the smaller counter twice. The GNU C

typeof

extension allows you to write safe macros that avoid this kind of problem (see Typeof). However, writing

MIN

and

MAX

as macros also forces you to use function-call notation for a fundamental arithmetic operation. Using GNU C++ extensions, you can write `int min = i <? j;' instead.

Since

<?

and

>?

are built into the compiler, they properly handle expressions with side-effects; `int min = i++ <? j++;' works correctly.

4.9 Conditionals with Omitted Operands

The middle operand in a conditional expression may be omitted. Then if the first operand is nonzero, its value is the value of the conditional expression.

Therefore, the expression

x ? : y
      

has the value of

x

if that is nonzero; otherwise, the value of

y

.

This example is perfectly equivalent to

x ? x : y
      

In this simple case, the ability to omit the middle operand is not especially useful. When it becomes useful is when the first operand does, or may (if it is a macro argument), contain a side effect. Then repeating the operand in the middle would perform the side effect twice. Omitting the middle operand uses the value already computed without the undesirable effects of recomputing it.