intmain(void){ std::cout << "# Case A (false && true) " << std::endl; if (LeftCondition(false) && RightCondition(true)) { // Left }
std::cout << "# Case B (true && true) " << std::endl; if (LeftCondition(true) && RightCondition(true)) { // Left, Right }
std::cout << "# Case C (false || true) " << std::endl; if (LeftCondition(false) || RightCondition(true)) { // Left, Right }
std::cout << "# Case D (true || true) " << std::endl; if (LeftCondition(true) || RightCondition(true)) { // Left } }
Case A와 D같은 경우 Short Circuit Evaluation에 의해 Left 조건만 실행됩니다. 다시 말해, Right 함수가 호출이 되지 않을 때가 있습니다. 만약 Right 함수이 꼭 호출되어야 한다면 위와 같이 작성할 경우 문제가 되고, 원인 파악이 어렵습니다. 따라서 앞의 조건과 뒤의 조건을 모두 호출하려는 경우엔 코드를 다른 방식으로 작성하여야 합니다.
네임스페이스는 코드에서 이름이 서로 충돌하는 문제를 해결하기 위해 나온 개념입니다. 예를 들어 foo라는 이름의 함수를 만들어서 사용하다가 외부 라이브러리를 참조했을 때, 거기에도 foo라는 함수가 있다면 충돌이 발생합니다. 이럴 경우, 컴파일러는 foo가 어떤 함수를 가리키는지 알 수 없게 됩니다.
It is in nameA It is in nameB using std::cout (not endl)
using namespace를 통해 nameA:: 를 생략하여 사용하였습니다. (using을 했어도 nameA를 붙여도 무방합니다.) 또한, using namespace가 아니라 using 후 특정 항목만 지정해서 사용가능합니다. using std::cout 을 통해 컴파일러에게 지시를 하여 cout은 std::없이 사용했지만 endl의 경우 std::endl로 사용하였습니다.
🧨 웬만하면 using 지시자는 사용하지 않는 방향으로 개발하시는 것이 좋습니다. 예상치 못한 변수나 함수명이 겹치는 경우가 발생할 수 있기 때문입니다.