출처 : C++ 실력 완성 올인원 패키지 Online. (fastcampus)
단축 평가 계산(Short-Circuit evaluation)이란 첫 번쨰 인수가 값을 결정하기에 충분하지 않은 경우에만, 두 번째 인수가 평가되는 일부 프로그래밍 언어(C, C++, JAVA 등)의 일부 논리 연산(AND, OR)의 계산이다.
AND 연산의 경우 좌항이 False 면 무조건(=우항의 bool값과 상관없이) False이기 때문에 우항은 평가되지 않고, OR 연산의 경우 좌항이 True 면 무조건 True이기 때문에 우항이 평가되지 않는 개념
프로그래머로써 단축 평가 계산을 고려하여 비용이 높은 코드는 나중에 평가 되도록 작성하면 좋다!👏
{
// short-circuit evaluation
int num0 = 10, num1(20);
int num2 = 20, num3(20);
// num0 == num1 이 false이기 때문에 num2 == num3은 평가할 필요가 없어서 평가되지 않는다.
if (num0 == num1 && num2 == num3)
cout << "AND" << endl;
// num0 != num1 이 true이기 때문에 num2 == num3은 평가할 필요가 없어서 평가되지 않는다.
if (num0 != num1 || num2 == num3)
cout << "OR" << endl;
// printf("") 의 반환값이 0이기 때문에 false로 평가돼서 우항의 printf("ABC")는 실행되지 않는다.
printf("") && printf("ABC");
cout << endl;
// printf("a") 의 반환값이 1이기 때문에 true로 평가돼서 우항의 printf("ABC")는 실행된다.
printf("a") && printf("ABC");
cout << endl;
// printf("a") 의 반환값이 1이기 때문에 true로 평가돼서 우항의 printf("ABC")는 실행되지 않는다.
printf("a") || printf("ABC");
cout << endl;
// printf("") 의 반환값이 0이기 때문에 false로 평가돼서 우항의 printf("ABC")는 실행된다.
printf("") || printf("ABC");
cout << endl;
}
AND, OR은 시퀀스 포인트 이므로 좌항의 식이 먼저 실행 및 평가된다는 것이 보장된다.
{
// &&, || 연산자는 시퀀스 포인트
}
cout << 1 && 2 << endl;
을 하게 되면&&
연산자와<<(left-shift)
비트 연산자의 우선순위 중 비트 연산자의 우선 순위가 더 높기 때문에 반드시(1 && 2)
를 해줘야 한다.
{
cout.setf(ios_base::boolalpha);
// 10이 bool로 평가 될 경우 true 평가 되어서 false 출력
cout << !10 << endl;
// 좌항과 우항의 정수가 둘 다 0이 아니기 때문에 둘 다 true로 평가되어 true && true 가 된다.
cout << (1 && 2) << endl; // true
}
```