본문 바로가기
개발/C, C++

[C/C++] 연산자 우선순위

by 77monkey 개발자 2023. 9. 18.
반응형

드디어 연산자에 대해서 다 다뤄봤습니다. 그럼 이제 연산자 우선순위에 대해서 알아보도록 합시다. 연산자 우선순위는 정말 중요합니다. 연산의 결과가 예상한 것과 다르게 된다면 해당 프로그램은 제대로 동작할 수 없기 때문입니다. 

 

연산자 우선순위

연산자 우선순위는 다양한 연산자가 표현식 내에서 어떤 순서로 계산되어야 하는지 결정하는 규칙입니다. 연산자 우선순위에 따라 연산자를 사용할 때 괄호를 추가하여 원하는 계산 순서를 지정할 수 있는데, 개인적으로 연산자 우선순위가 헷갈릴 때에는 괄호를 많이 씁니다. 

아래의 연산자 우선순위 표를 보시면 숫자가 작을수록 먼저 연산이 됩니다. 

연산자-우선순위
연산자 우선순위, 출처:  https://en.wikipedia.org/wiki/Order_of_operations

 

연산자 우선순위 예시

아래 코드의 결과는 어떻게 될까요? 결과를 예측해 보세요. 이전에 배웠던 short circuit을 생각해서 var1 = 3이 참이기 때문에 "var1 3 var2 0"을 예상하셨을 것 같습니다. 하지만 연산자 우선순위에 의해서 예상했던 결과와 다른 결과가 나옵니다. 

#include <stdio.h>

int main() {

	int var1 = 0;
	int var2 = 0;
	
	if (var1 = 3 || var2 != 0) {
		printf("var1 %d var2 %d\n", var1, var2);
	}

	return 0;
}

결과는 아래와 같습니다. 결과를 보시니 이해가 되시나요? 위에 있던 연산자 우선순위 표를 보고 오시면 대입연산자(=)가 논리 OR 연산자(||)보다 우선순위가 낮습니다. 그렇기 때문에 3 || var2 != 0에 의해서 참이 되고, 참은 1로 표현이 되기 때문에 var1에 1이 들어가게 됩니다. 그래서 결과적으로는 if(var1)이 되고 var1이 0이 아닌 1로 업데이트되었기 때문에 출력을 하게 됩니다. 그래서 var1은 1이 되고 var2는 0이 됩니다.

var1 1 var2 0

의도했던 대로 표현하려면 아래와 같이 코드를 수정하면 됩니다. 위에서도 말씀드렸다시피 괄호를 사용하시면 됩니다. 논리 OR 연산자 오른쪽은 괄호를 안 써도 되지만, 가독성을 높이기 위해서 논리 OR 연산자 양쪽을 괄호로 묶어 주었습니다.

#include <stdio.h>

int main() {

	int var1 = 0;
	int var2 = 0;
	
	if ((var1 = 3) || (var2 != 0)) {
		printf("var1 %d var2 %d\n", var1, var2);
	}

	return 0;
}

결과는 우리가 처음에 예상한 대로 나옵니다. 

var1 3 var2 0

 

마무리

연산자 우선순위를 다 외우고 다니시는 분은 없을 것이라 생각됩니다. 우리가 예상한 우선순위가 항상 맞다는 보장이 없습니다. 그렇기 때문에 헷갈리거나 확신이 없으실 때에는 괄호를 사용해서 우선순위를 강제로 높여주는 방법이 있습니다. 불안한 것보다 괄호를 한번 써주시는 것이 훨씬 마음에 평화를 줄 수 있는 방법이라는 점을 잊지 않으셨으면 좋겠습니다. 

 

반응형

'개발 > C, C++' 카테고리의 다른 글

[C/C++] inline 함수  (0) 2024.05.02
[C/C++] 함수(function)  (0) 2024.05.02
[C/C++] 캐스팅 연산자  (1) 2023.09.17
[C/C++] sizeof 연산자  (0) 2023.09.15
[C/C++] 쉼표 연산자(,)  (0) 2023.09.14