##### 15.4.1.1 C and C`++` Operators

Operators must be defined on values of specific types. For instance, `+` is defined on numbers, but not on structures. Operators are often defined on groups of types.

For the purposes of C and C`++`, the following definitions hold:

- Integral types include `int` with any of its storage-class specifiers; `char`; `enum`; and, for C`++`, `bool`.
- Floating-point types include `float`, `double`, and `long double` (if supported by the target platform).
- Pointer types include all types defined as `(`type`*)`.
- Scalar types include all of the above.

The following operators are supported. They are listed here in order of increasing precedence:

`,`
  The comma or sequencing operator. Expressions in a comma-separated list are evaluated from left to right, with the result of the entire expression being the last expression evaluated.
`=`
  Assignment. The value of an assignment expression is the value assigned. Defined on scalar types.
op`=`
  Used in an expression of the form a`` op`=` b, and translated to a`=` a op b. op`=` and `=` have the same precedence. op is any one of the operators `|`, `^`, `&`, `<<`, `>>`, `+`, `-`, `*`, `/`, `%`.
`?:`
  The ternary operator. a`?` b`:` c can be thought of as: if a then b else c. a should be of an integral type.
`||`
  Logical or. Defined on integral types.
`&&`
  Logical and. Defined on integral types.
`|`
  Bitwise or. Defined on integral types.
`^`
  Bitwise exclusive-or. Defined on integral types.
`&`
  Bitwise and. Defined on integral types.
`==`, `!=`
  Equality and inequality. Defined on scalar types. The value of these expressions is 0 for false and non-zero for true.
`<`, `>`, `<=`, `>=`
  Less than, greater than, less than or equal, greater than or equal. Defined on scalar types. The value of these expressions is 0 for false and non-zero for true.
`<<`, `>>`
  left shift, and right shift. Defined on integral types.
`@`
  The gdb “artificial array” operator (see Expressions).
`+`, `-`
  Addition and subtraction. Defined on integral types, floating-point types and pointer types.
`*`, `/`, `%`
  Multiplication, division, and modulus. Multiplication and division are defined on integral and floating-point types. Modulus is defined on integral types.
`++`, `--`
  Increment and decrement. When appearing before a variable, the operation is performed before the variable is used in an expression; when appearing after it, the variable's value is used before the operation takes place.
`*`
  Pointer dereferencing. Defined on pointer types. Same precedence as `++`.
`&`
  Address operator. Defined on variables. Same precedence as `++`.

  For debugging C`++`, gdb implements a use of ‘`&`’ beyond what is allowed in the C`++` language itself: you can use ‘`&(&ref)`’ to examine the address where a C`++` reference variable (declared with ‘`&ref`’) is stored.

`-`
  Negative. Defined on integral and floating-point types. Same precedence as `++`.
`!`
  Logical negation. Defined on integral types. Same precedence as `++`.
`~`
  Bitwise complement operator. Defined on integral types. Same precedence as `++`.
`.`, `->`
  Structure member, and pointer-to-structure member. For convenience, gdb regards the two as equivalent, choosing whether to dereference a pointer based on the stored type information. Defined on `struct` and `union` data.
`.*`, `->*`
  Dereferences of pointers to members.
`[]`
  Array indexing. a`[`i`]` is defined as `*(`a`+`i`)`. Same precedence as `->`.
`()`
  Function parameter list. Same precedence as `->`.
`::`
  C`++` scope resolution operator. Defined on `struct`, `union`, and `class` types.
`::`
  Doubled colons also represent the gdb scope operator (see Expressions). Same precedence as `::`, above.

If an operator is redefined in the user code, gdb usually attempts to invoke the redefined version instead of using the operator's predefined meaning.