새소식

💻 Programming (프로그래밍)/C++

[C++] if문이 작동하기 위한 조건은 어떻게 돌아갈까?

  • -

우리가 흔히 쓰는 if문 조건문으로 if(Expression) {}

Expression의 값이 참이 되면 조건문 구문이 실행됩니다.

 

 

Q) 조건문 속 조건식은 어떻게 해야 돌아가나요?

A) 0을 제외한 모든 것이 if구문을 작동하게 만들어줍니다.

 

그 외에 실행할만한 예시로는 아래가 있습니다.

// if문에 0이외에 것은 모두 다 실행됩니다.
if(1) { cout << '1' << endl; }; // 1

// 조건식에 변수선언도 가능합니다.
if(int a = 1) { cout << a << endl;} // 1 , 하지만 a는 if block구문 안에서만 정의됩니다

// 변수의 범위를 조건식으로 정하고 싶으면 어떻게할까요?
int x = 10;
if(5 <= x < 10) { cout << "true?" << endl;} // 실제론 x는 10이므로 조건식이 실행하면 안되지만, 여기서는 실행이 되버립니다. 왜그럴까요?

 

Q) 조건식에서 (5 <= x < 10) 이런식으로 써버리면 왜 안될까요?

A) C++은 한번에 하나의 연산자를 계산합니다.

 

5 <= x < 10 인경우에는 , 5 <= x 인 경우가 먼저 계산되어, true(1) 값이 됩니다. 이후 (1(true) < 10) 조건식이 참이 되어 조건식 전체가 참이 되어버립니다.

 

 

예를들면

int a = 1;
if (0 < a > 2) { cout << "true"; } // 실행되지 않습니다.
if (2 < a > 0) { cout << "true"; } // 실행되지 않습니다.

관계연산자( < , >) 들을 연속적으로 사용시에는 왼쪽부터 차례차례 값이 들어가게 됩니다.

 

(0 < a) == true(1)

((0 < a) > 2) == false(0) 요론식으로 진행 되는 셈이죠.

 

 

그렇다면 이런건?

int a = 1; int b = 2;

if (a == 2, b == 2) {cout << "실행" << endl;} // 실행됩니다.
if (b == 2, a == 2) {cout << "실행" << endl;} // 실행 되지 않습니다.

이때는 조건식이 의도대로 흘러가는 경우에 혹은 쉼표연산자인 경우 왼쪽 인수들은 무시되는 경향이 있습니다. 즉 오른쪽 인수만 신경쓰고 조건식으로 보는 것이죠

 

 

이건 모두, 연산자들의 순서에 따라 결정됩니다.

 

Q) 연산자들의 순서는 어떻게 되나요??

C++에는 아래의 연산자들이 있고, 해당 우선순위 및 결합법칙대로 진행됩니다.

출처: https://ko.wikipedia.org/wiki/C%EC%99%80_C%2B%2B%EC%9D%98_%EC%97%B0%EC%82%B0%EC%9E%90

 

 

Q) 그렇다면 if문의 실행속도는 어떨까요?

A) 저는 if문의 조건식을 참, 거짓만 판단하고 거짓은 코드를 아예 안읽을줄 알았습니다. 하지만! 연산낭비가 일어날수도 있다는 사실을 듣고 흥미로워서 찾아본결과! CPU는 분기예측을 한다고 하네요

 

CPU는 파이프라이닝을 통해 실행 속도를 향상시키는데, 다음에 실행될 명령어를 미리 실행시키는데, 이때 if문과 같은 분기문이 있을 경우에는 그 다음에 실행될 명령을 미리 알지 못합니다. 그래서 CPU는 분기 예측을 통해서, 미리 추측한다고 합니다. 그리고 미리 추측한 연산한 것들을 다 버리게 되는데, 이때 연산낭비가 일어납니다.!

 

+ 또한 컴파일러가 최적화할때 3개 이상되는 if문 보다 점프가 되는 switch 문이 더 유리한 경우가 많다고합니다.

오호 새로운 정보를 얻어갑니다.

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.