#include <iostream>

int main()
{
    static const auto a = [] ()->bool { return std::cout << 'A' ; } ;
    static const auto b = [] ()->bool { return std::cout << 'B' ; } ;
    static const auto c = [] ()->bool { return std::cout << 'C' ; } ;
    static const auto newline = [] { std::cout << '\n' ; } ;

    ( a() || b() || c() ) ; newline() ; // A
    ( !a() || b() || c() ) ; newline() ; // AB
    ( !a() || !b() || c() ) ; newline() ; // ABC
    newline() ;

    ( a() && b() && c() ) ; newline() ; // ABC
    ( a() && !b() && c() ) ; newline() ; // AB
    ( !a() && b() && c() ) ; newline() ; // A
    newline() ;

    // && has higher precedence; in x || y&&z, x is sequenced before y&&z
    ( a() || b() && c() ) ; newline() ; // A
    ( !a() || b() && c() ) ; newline() ; // ABC
    ( !a() || !b() && c() ) ; newline() ; // AB
    newline() ;

    // && has higher precedence; in x&&y || z, x&&y is sequenced before z
    ( a() && b() || c() ) ; newline() ; // AB
    ( !a() && b() || c() ) ; newline() ; // AC
    ( a() && !b() || c() ) ; newline() ; // ABC
}
