C++ Operator Precedence
  The operators at the top of this list are evaluated first.
  
    
      | Precedence | 
      Operator | 
      Description | 
      Example | 
      Associativity | 
    
    
      | 1 | 
      
      :: 
       | 
      Scoping operator 
       | 
      Class::age = 2; 
       | none | 
    
    
      | 2 | 
      () 
      [] 
      -> 
      . 
      ++ 
      -- | 
      Grouping operator 
      Array access 
      Member access from a pointer 
      Member access from an object 
      Post-increment 
      Post-decrement | 
      (a + b) / 4; 
      array[4] = 2; 
      ptr->age = 34; 
      obj.age = 34; 
      for( i = 0; i < 10; i++ ) ... 
      for( i = 10; i > 0; i-- ) ... | 
      left to right | 
    
    
      | 3 | 
      ! 
      ~ 
      ++ 
      -- 
      - 
      + 
      * 
      & 
      (type) 
      sizeof | 
      Logical negation 
      Bitwise complement 
      Pre-increment 
      Pre-decrement 
      Unary minus 
      Unary plus 
      Dereference 
      Address of 
      Cast to a given type 
      Return size in bytes | 
      if( !done ) ... 
      flags = ~flags; 
      for( i = 0; i < 10; ++i ) ... 
      for( i = 10; i > 0; --i ) ... 
      int i = -1; 
      int i = +1; 
      data = *ptr; 
      address = &obj; 
      int i = (int) floatNum; 
      int size = sizeof(floatNum); | 
      right to left | 
    
    
      | 4 | 
      ->* 
      .* | 
      Member pointer selector 
      Member pointer selector | 
      ptr->*var = 24; 
      obj.*var = 24; | 
      left to right | 
    
    
      | 5 | 
      * 
      / 
      % | 
      Multiplication 
      Division 
      Modulus | 
      int i = 2 * 4; 
      float f = 10 / 3; 
      int rem = 4 % 3; | 
      left to right | 
    
    
      | 6 | 
      + 
      - | 
      Addition 
      Subtraction | 
      int i = 2 + 3; 
      int i = 5 - 1; | 
      left to right | 
    
    
      | 7 | 
      << 
      >> | 
      Bitwise shift left 
      Bitwise shift right | 
      int flags = 33 << 1; 
      int flags = 33 >> 1; | 
      left to right | 
    
    
      | 8 | 
      < 
      <= 
      > 
      >= | 
      Comparison less-than 
      Comparison less-than-or-equal-to 
      Comparison greater-than 
      Comparison geater-than-or-equal-to | 
      if( i < 42 ) ... 
      if( i <= 42 ) ... 
      if( i > 42 ) ... 
      if( i >= 42 ) ... | 
      left to right | 
    
    
      | 9 | 
      == 
      != | 
      Comparison equal-to 
      Comparison not-equal-to | 
      if( i == 42 ) ... 
      if( i != 42 ) ... | 
      left to right | 
    
    
      | 10 | 
      & | 
      Bitwise AND | 
      flags = flags & 42; | 
      left to right | 
    
    
      | 11 | 
      ^ | 
      Bitwise exclusive OR | 
      flags = flags ^ 42; | 
      left to right | 
    
    
      | 12 | 
      | | 
      Bitwise inclusive (normal) OR | 
      flags = flags | 42; | 
      left to right | 
    
    
      | 13 | 
      && | 
      Logical AND | 
      if( conditionA && conditionB ) ... | 
      left to right | 
    
    
      | 14 | 
      || | 
      Logical OR | 
      if( conditionA || conditionB ) ... | 
      left to right | 
    
    
      | 15 | 
      ? : | 
      Ternary conditional (if-then-else) | 
      int i = (a > b) ? a : b; | 
      right to left | 
    
    
      | 16 | 
      = 
      += 
      -= 
      *= 
      /= 
      %= 
      &= 
      ^= 
      |= 
      <<= 
      >>= | 
      Assignment operator 
      Increment and assign 
      Decrement and assign 
      Multiply and assign 
      Divide and assign 
      Modulo and assign 
      Bitwise AND and assign 
      Bitwise exclusive OR and assign 
      Bitwise inclusive (normal) OR and assign 
      Bitwise shift left and assign 
      Bitwise shift right and assign | 
      int a = b; 
      a += 3; 
      b -= 4; 
      a *= 5; 
      a /= 2; 
      a %= 3; 
      flags &= new_flags; 
      flags ^= new_flags; 
      flags |= new_flags; 
      flags <<= 2; 
      flags >>= 2; | 
      right to left | 
    
    
      | 17 | 
      , | 
      Sequential evaluation operator | 
      for( i = 0, j = 0; i < 10; i++, j++
      ) ... | 
      left to right | 
    
  
  It is important to note that there is no specified
  precedence for the operation of changing a variable into a
  value.  For example, consider the following code:
  
  float x, result;
  x = 1;
  result = x / ++x;
  The value of result is not guaranteed to be
  consistent across different compilers, because it is not clear
  whether the computer should change the variable x 
  (the one that occurs on the left side of the division operator) 
  before using it.  Depending on which compiler you are using, the
  variable result can either be 1.0 or 
  0.5.  The bottom line is that you should not use
  the same variable multiple times in a single expression when using
  operators with side effects.