// -------------
// Operators.c++
// -------------

#include <cassert>  // assert
#include <iostream> // cout, endl

int main () {
    using namespace std;
    cout << "Operators.c++" << endl;

    {
    const int i = 2;
    const int j = -i;
    assert(i ==  2);
    assert(j == -2);
//  ++-i;                            // error: lvalue required as increment operand
    }

    {
    int i = 2;
    int j = ++i;
    assert(i == 3);
    assert(j == 3);
    ++++i;
    assert(i == 5);
    (++i)++;
    assert(i == 7);
    }

    {
    int i = 2;
    int j = i++;
    assert(i == 3);
    assert(j == 2);
//  i++++;                           // error: lvalue required as increment operand
//  ++(i++);                         // error: lvalue required as increment operand
    }

    {
          int i = 2;
    const int j = 3;
    const int k = (i = j);
    assert(i == 3);
    assert(j == 3);
    assert(k == 3);
    ++(i = j);
    assert(i == 4);
    }

    {
    const int i = 2;
    const int j = 3;
    const int k = i + j;
    assert(i == 2);
    assert(j == 3);
    assert(k == 5);
//  ++(i + j);                       // error: lvalue required as increment operand
    }

    {
          int i = 2;
    const int j = 3;
    int k = (i += j);
    assert(i == 5);
    assert(j == 3);
    assert(k == 5);
    ++(i += j);
    assert(i == 9);
    }

    {
    const int i = 12;
    const int j = 10;
    const int k = i / j;             // integer division
    assert(i == 12);
    assert(j == 10);
    assert(k ==  1);
//  ++(i / j);                       // error: lvalue required as increment operand
    }

    {
          int i = 12;
    const int j = 10;
    const int k = (i /= j);
    assert(i ==  1);
    assert(j == 10);
    assert(k ==  1);
    ++(i /= j);
    assert(i ==  1);
    }

    {
    const int i = 12;
    const int j = 10;
    const int k = i % j;
    assert(i == 12);
    assert(j == 10);
    assert(k ==  2);
//  ++(i % j);                       // error: lvalue required as increment operand
    }

    {
          int i = 12;
    const int j = 10;
    const int k = (i %= j);
    assert(i ==  2);
    assert(j == 10);
    assert(k ==  2);
    ++(i %= j);
    assert(i ==  3);
    }

    {
    const int i = 2;
    const int j = 3;
    const int k = i << j;
    assert(i == 2);
    assert(j == 3);
    assert(k == 16);
//  ++(i << j);                      // error: lvalue required as increment operand
    }

    {
          int i = 2;
    const int j = 3;
    const int k = (i <<= j);
    assert(i ==  16);
    assert(j ==   3);
    assert(k ==  16);
    ++(i <<= j);
    assert(i == 129);
    }

    {
    const int i = 10;                // 0000 0000 0000 1010
    const int j = ~i;                // 1111 1111 1111 0101
    const int k = ~i + 1;            // 1111 1111 1111 0110
    assert(i ==  10);
    assert(j == -11);
    assert(k == -10);
//  ++~i;                            // error: lvalue required as increment operand
    }

    {
    const int i = 10;                // 1010
    const int j = 12;                // 1100
    const int k = i & j;             // 1000
    assert(i == 10);
    assert(j == 12);
    assert(k ==  8);
//  ++(i & j);                       // error: lvalue required as increment operand
    }

    {
          int i = 10;                // 1010
    const int j = 12;                // 1100
    const int k = (i &= j);          // 1000
    assert(i ==  8);
    assert(j == 12);
    assert(k ==  8);
    ++(i &= j);                      // 1001
    assert(i ==  9);
    }

    {
    const int i = 10;                // 1010
    const int j = 12;                // 1100
    const int k = i | j;             // 1110
    assert(i == 10);
    assert(j == 12);
    assert(k == 14);
//  ++(i | j);                       // error: lvalue required as increment operand
    }

    {
          int i = 10;                // 1010
    const int j = 12;                // 1100
    const int k = (i |= j);          // 1110
    assert(i == 14);
    assert(j == 12);
    assert(k == 14);
    ++(i |= j);                      // 1111
    assert(i == 15);
    }

    {
    const int i = 10;                // 1010
    const int j = 12;                // 1100
    const int k = i ^ j;             // 0110
    assert(i == 10);
    assert(j == 12);
    assert(k ==  6);
//  ++(i ^ j);                       // error: lvalue required as increment operand
    }

    {
          int i = 10;                // 1010
    const int j = 12;                // 1100
    const int k = (i ^= j);          // 0110
    assert(i ==  6);
    assert(j == 12);
    assert(k ==  6);
    ++(i ^= j);                      // 1011
    assert(i == 11);
    }

    {
    int i = 10;                      // 1010
    int j = 12;                      // 1100
    i ^= j;
    assert(i ==  6);                 // 0110
    assert(j == 12);                 // 1100
    j ^= i;
    assert(i ==  6);                 // 0110
    assert(j == 10);                 // 1010
    i ^= j;
    assert(i == 12);                 // 1100
    assert(j == 10);                 // 1010
    }

    {
    int i = 10;
    int j = 12;
    i += j;
    assert(i == 22);
    assert(j == 12);
    j = i - j;
    assert(i == 22);
    assert(j == 10);
    i -= j;
    assert(i == 12);
    assert(j == 10);
    }

    {
    const bool a = true;
    const bool b = true;
    const bool c = false;
    assert(a && b);
    assert(!(a && c));
    assert(a || b);
    assert(a || c);
    assert((a && b) == !(!a || !b));
    assert((a && c) == !(!a || !c));
    }

    {
    int a[] = {2, 3, 4};
    assert(a[1] == 3);
    ++a[1];
    assert(a[1] == 4);
    }

    cout << "Done." << endl;
    return 0;}


syntax highlighted by Code2HTML, v. 0.9.1