#include <iostream>

bool foo()
{
	std::cout << "  called foo()" << std::endl;
	return false;
}

int main()
{
	bool b;
	std::cout << "b = foo() && foo()" << std::endl;
	b = foo() && foo();
	
	// foo() not called -- b is false, so no need to continue
	std::cout << "b = b && foo()" << std::endl;
	b = b && foo();
	
	// foo() still called because &= is eager
	std::cout << "b &= foo()" << std::endl;
	b &= foo();
	
	// equivalent is the eager form of &
	std::cout << "b = b & foo()" << std::endl;
	b = b & foo();
}