|| 연산자(OR)의 특징은 논리검사 대상 중 하나라도 true가 반환될 경우 true를 반환한다.
그리고 || 연산자의 결합 방향은 →(오른쪽) 방향이다.
그렇다면 아마 C++에서는 최적화를 위해서
왼쪽 파트의 논리 검사에서 true가 반환된다면
오른쪽 파트는 검사를 스킵하지 않을까? 라는 의문이 들었다.
바로 실험해보자
#include <iostream>
#include <vector>
int main()
{
std::vector<int> vecIntPtr;
vecIntPtr[0] = 1;
return 0;
}
우선 위의 코드를 실행 시키면 vecIntPtr에는 원소가 하나도 추가되지 않았으므로 0번 인덱스를 강제로 참조하게 되면 아래와 같은 에러가 발생한다.

또한 std::vector의 empty() 함수는 생성한 벡터 컨테이너가 비어있을 경우 true를 반환한다.
#include <iostream>
#include <vector>
int main()
{
std::vector<int> vecIntPtr;
if (vecIntPtr.empty())
printf("비어있음!");
return 0;
}

그렇다면 || 연산자를 통해서
(비어있는지 확인) || (0번 인덱스의 값을 체크) 하게 되면
(비어있는지 확인) 하는 과정에서 true가 반환되고,
(0번 인덱스의 값을 체크)하는 과정에서는 비어있는 벡터 컨테이너를 강제로 참조하므로 에러가 발생한다.
그런데 만약 여기서 왼쪽의 논리검사에서 true를 확인했을 때
더 이상 논리검사를 하지 않고 스킵하게 된다면
에러가 발생하지 않을 것이다.
#include <iostream>
#include <vector>
int main()
{
std::vector<int> vecIntPtr;
if (vecIntPtr.empty() || vecIntPtr[0] == 0)
printf("정상동작");
return 0;
}

혹시나 싶어서 3중으로도 해 보았으나
#include <iostream>
#include <vector>
int main()
{
std::vector<int> vecIntPtr;
if (true || vecIntPtr.empty() || vecIntPtr[0] == 0)
printf("정상동작");
return 0;
}
마찬가지로 에러가 발생하지 않았다.
결론
|| 연산자는 왼쪽에서부터 논리검사를 하며,
검사 과정에서 true가 하나라도 발견되면 더이상 검사하지 않고 바로 true를 반환한다.
'자습' 카테고리의 다른 글
실험실)typeid(T).name() vs typeid(T).hash_code() (0) | 2022.11.05 |
---|---|
제목토글 테스트 (0) | 2022.08.20 |
220714_2_DX Device Initialize 1 (0) | 2022.08.20 |
220714_1_기본 틀 작업 2 (0) | 2022.08.20 |
220713_기본 틀 작업, .bat파일 자동화 (0) | 2022.08.20 |
|| 연산자(OR)의 특징은 논리검사 대상 중 하나라도 true가 반환될 경우 true를 반환한다.
그리고 || 연산자의 결합 방향은 →(오른쪽) 방향이다.
그렇다면 아마 C++에서는 최적화를 위해서
왼쪽 파트의 논리 검사에서 true가 반환된다면
오른쪽 파트는 검사를 스킵하지 않을까? 라는 의문이 들었다.
바로 실험해보자
#include <iostream>
#include <vector>
int main()
{
std::vector<int> vecIntPtr;
vecIntPtr[0] = 1;
return 0;
}
우선 위의 코드를 실행 시키면 vecIntPtr에는 원소가 하나도 추가되지 않았으므로 0번 인덱스를 강제로 참조하게 되면 아래와 같은 에러가 발생한다.

또한 std::vector의 empty() 함수는 생성한 벡터 컨테이너가 비어있을 경우 true를 반환한다.
#include <iostream>
#include <vector>
int main()
{
std::vector<int> vecIntPtr;
if (vecIntPtr.empty())
printf("비어있음!");
return 0;
}

그렇다면 || 연산자를 통해서
(비어있는지 확인) || (0번 인덱스의 값을 체크) 하게 되면
(비어있는지 확인) 하는 과정에서 true가 반환되고,
(0번 인덱스의 값을 체크)하는 과정에서는 비어있는 벡터 컨테이너를 강제로 참조하므로 에러가 발생한다.
그런데 만약 여기서 왼쪽의 논리검사에서 true를 확인했을 때
더 이상 논리검사를 하지 않고 스킵하게 된다면
에러가 발생하지 않을 것이다.
#include <iostream>
#include <vector>
int main()
{
std::vector<int> vecIntPtr;
if (vecIntPtr.empty() || vecIntPtr[0] == 0)
printf("정상동작");
return 0;
}

혹시나 싶어서 3중으로도 해 보았으나
#include <iostream>
#include <vector>
int main()
{
std::vector<int> vecIntPtr;
if (true || vecIntPtr.empty() || vecIntPtr[0] == 0)
printf("정상동작");
return 0;
}
마찬가지로 에러가 발생하지 않았다.
결론
|| 연산자는 왼쪽에서부터 논리검사를 하며,
검사 과정에서 true가 하나라도 발견되면 더이상 검사하지 않고 바로 true를 반환한다.
'자습' 카테고리의 다른 글
실험실)typeid(T).name() vs typeid(T).hash_code() (0) | 2022.11.05 |
---|---|
제목토글 테스트 (0) | 2022.08.20 |
220714_2_DX Device Initialize 1 (0) | 2022.08.20 |
220714_1_기본 틀 작업 2 (0) | 2022.08.20 |
220713_기본 틀 작업, .bat파일 자동화 (0) | 2022.08.20 |