기본 콘텐츠로 건너뛰기

방송대 프로그래밍언어론 11강: 수식 평가와 연산자 우선순위

0-썸네일-요약노트-프로그래밍언어론-11강

방송대 프로그래밍언어론 11강: 수식 평가와 연산자 우선순위

-i++-++i는 기호가 비슷하지만 결과와 변수의 변화 시점이 다르다. 복잡한 수식은 왼쪽부터 읽는 대신 연산자를 묶고, 타입을 맞추고, 값을 계산하고, 부수효과를 반영하는 순서로 풀어야 한다. 이 평가 절차를 익히면 산술·관계·논리 연산과 단락회로 계산을 일관되게 추적할 수 있다.

수식 문제는 네 단계 평가표로 푼다

수식은 값을 나타내는 표현이다. 데이터 표현 하나, 변수 하나, 함수 호출 하나도 값을 나타내면 수식이 될 수 있고, 피연산자에 연산자가 적용된 형태도 수식이다. 여러 연산자가 섞였을 때는 다음 네 칸을 순서대로 채운다.

평가 단계확인 질문놓치기 쉬운 점
묶기우선순위와 결합방향에 따라 어떤 피연산자를 먼저 모으는가?결합방향을 실행 순서와 동일시하지 않기
타입 맞추기피연산자 타입이 다르면 어떤 변환이 일어나는가?정수 나눗셈이 끝난 뒤 실수로 바뀌는 경우
연산하기묶인 부분식은 어떤 값을 내는가?관계 연산의 결과는 참·거짓
상태 반영증가·감소나 단락회로 때문에 값 또는 실행 여부가 바뀌는가?후위 연산은 현재 값을 먼저 사용

판단 핵심: 우선순위는 먼저 묶을 대상을 정하고, 결합방향은 같은 우선순위끼리 어떻게 묶을지를 정한다. 둘 다 괄호를 복원하는 규칙으로 사용한다.

값을 나타내면 연산자 없이도 수식이다

정수 2, 실수 -5.3, 문자열 "abc", 변수 i, Python의 리스트 표현 [2, 3, 1]처럼 데이터 자체를 나타내는 표현도 수식이다. 함수 호출도 반환값이 있으면 수식이 될 수 있다.

int get_score(void) {
    return 72;
}

/* get_score()라는 수식의 값은 72 */

연산자는 피연산자에 적용되어 연산을 수행하는 함수처럼 이해할 수 있다. 기본 연산자뿐 아니라 값을 반환하는 함수도 수식의 연산 역할을 할 수 있다. 따라서 “수식에는 반드시 연산 기호가 있어야 한다”는 생각은 틀리다.

수식은 값을 나타내고 문장은 처리를 지시한다

수식의 중심은 이고 문장의 중심은 처리다. 문장은 수식을 계산하거나, 수행 흐름을 바꾸거나, 값을 출력하는 일을 지시한다. Python에서는 3 + 2처럼 수식 자체가 수식문으로 쓰일 수 있고, if는 수행 흐름을 바꾸는 문장이다.

C·C++에서는 수식 끝에 세미콜론을 붙이면 수식문이 된다. 예를 들어 i = 3 + 2는 값 5를 갖는 수식이고, i = 3 + 2;는 그 수식을 실행하는 문장이다. 그러나 문장 끝의 세미콜론을 지운다고 언제나 수식이 되는 것은 아니다. if 구문은 세미콜론 유무로 수식이 되지 않는다.

오개념 교정: 세미콜론은 수식과 문장을 구분하는 유일한 기준이 아니다. “최종적으로 값을 나타내는가, 아니면 처리를 지시하는가?”를 먼저 묻고 언어의 문법을 확인한다.

연산자 종류는 피연산자 수와 결과 타입까지 함께 본다

산술 연산자는 사칙연산 외에도 언어별로 나머지, 몫, 거듭제곱, 증가·감소, 부호 연산을 제공할 수 있다. 강의에서는 C·C++의 나머지 %와 전위·후위 증가·감소, Python의 몫 //, 나머지 %, 거듭제곱 **를 비교한다. 단항 연산자는 피연산자 하나, 이항 연산자는 두 개, C·C++의 조건 연산자 ?:는 세 개의 피연산자를 사용한다.

분류대표 연산자피연산자 수결과를 볼 때의 질문
산술+, -, *, /, %주로 2수치 타입과 나눗셈 규칙은?
단항 산술전위·후위 ++, 부호 -1값 사용과 상태 변경 중 무엇이 먼저인가?
관계>, >=, ==, !=2비교 전에 타입을 맞춰야 하는가?
논리&&, ||, !2 또는 1오른쪽 피연산자를 실제로 평가하는가?
그 밖의 연산&, ^, |, ~, <<, >>, ?:1~3비트 연산인지 조건 선택인지?

우선순위는 수식에 숨은 괄호를 복원한다

강의의 C·C++ 기준에서 후위 증가·감소가 가장 높고, 전위 증가·감소와 단항 부호가 그다음이다. 이어 곱셈·나눗셈·나머지, 덧셈·뺄셈, 비트 이동, 대소 관계, 동등 관계, 논리곱, 논리합 순으로 낮아진다.

직접 구성한 6 + 4 * 2 - 3을 평가해 보자.

  1. *+-보다 높으므로 4 * 2를 먼저 묶는다.
  2. 수식은 6 + 8 - 3이 된다.
  3. +-는 같은 우선순위이며 좌결합이므로 (6 + 8) - 3으로 묶는다.
  4. 14 - 3의 결과는 11이다.
6 + 4 * 2 - 3
= 6 + 8 - 3
= (6 + 8) - 3
= 11

같은 우선순위에서는 결합방향으로 괄호를 정한다

9 - 3 + 2 - 4에서 덧셈과 뺄셈은 같은 우선순위이고 좌결합이다. 따라서 ((9 - 3) + 2) - 4로 묶어 6, 8, 4의 순서로 계산한다. 9 - (3 + 2) - 4처럼 임의로 괄호를 만들면 다른 수식이 된다.

반면 전위 증가·감소와 단항 부호는 같은 층에서 우결합이다. -++i-(++i)로 묶인다. 결합방향은 같은 우선순위의 연산자가 이어질 때 괄호를 어느 쪽부터 복원할지 정하는 규칙이지, 프로그램의 모든 부수효과 실행 순서를 일반적으로 보장하는 말은 아니다.

전위와 후위는 값 장부와 상태 장부를 나누어 추적한다

학습을 위해 i=6에서 두 수식을 비교하자. 전위 증가 ++i는 값을 먼저 7로 바꾸고 7을 사용한다. 후위 증가 i++는 현재 값 6을 수식에 먼저 제공하고, 그 뒤 저장된 값을 7로 바꾼다.

수식묶기수식에 사용되는 값수식 결과평가 뒤 i
-++i-(++i)증가한 7-77
-i++-(i++)증가 전 6-67

두 수식 모두 평가 뒤 i는 7이지만 수식 결과는 다르다. 기호의 위치만 보는 대신 ‘이번 계산에 내놓는 값’과 ‘계산 뒤 변수에 저장된 값’을 두 장부로 분리하면 혼동을 줄일 수 있다.

타입 변환은 연산 전에 피연산자의 공통 기준을 만든다

타입 변환은 주어진 타입의 값을 다른 타입의 값으로 바꾸는 것이다. 묵시적 변환은 언어 정책에 따라 컴파일러가 자동으로 수행하며, 강의에서는 대체로 데이터 집합이 커지는 확대 방향을 설명한다. 명시적 변환인 캐스팅은 프로그래머가 지정하며 확대와 축소 모두 가능하다.

7.5 * 4
→ 7.5 * 4.0
→ 30.0

(int)7.5 * 4
→ 7 * 4
→ 28

축소 변환은 정보가 사라질 수 있다. 위 예에서 7.5를 정수형으로 바꾸면서 소수 부분 0.5가 사라졌고, 그 뒤의 곱셈 결과도 30.0이 아니라 28이 되었다. 캐스팅은 표기만 바꾸는 장식이 아니라 이후 연산의 입력값과 결과를 바꾼다.

정수 나눗셈 뒤의 변환은 잃어버린 소수부를 되살리지 못한다

직접 구성한 C·C++식 비교 9 / 2 >= 4.2를 평가하면 먼저 정수끼리 나눈다. 9 / 2의 결과는 4이고, 비교를 위해 4가 4.0으로 확대되어 4.0 >= 4.2가 되므로 결과는 거짓이다.

반대로 9 / 2 >= (int)4.2에서는 오른쪽이 4로 축소된다. 왼쪽 정수 나눗셈도 4이므로 4 >= 4가 되어 참이다.

오류 방지: 변환이 수식의 어느 부분보다 먼저 적용되는지 괄호로 표시한다. 정수 나눗셈이 이미 4를 만든 뒤 4.0으로 바뀌어도 원래의 4.5가 복원되지는 않는다.

관계 연산은 산술 계산 뒤 참·거짓을 만든다

관계 연산자는 두 피연산자를 비교하고 결과로 참 또는 거짓을 낸다. 산술 연산자보다 우선순위가 낮고, 대소 관계 연산자는 동등 관계 연산자보다 높다. 예를 들어 다음 수식은 숨은 괄호를 복원하면 흐름이 보인다.

4 > 1 == 8 - 5 > 2
→ (4 > 1) == ((8 - 5) > 2)
→ true == (3 > 2)
→ true == true
→ true

산술 부분 8 - 5를 먼저 계산하고, 두 관계 연산이 각각 논리값을 만든 뒤, 마지막으로 두 논리값의 동등 여부를 비교한다.

논리곱은 논리합보다 먼저 묶이고 단락회로가 실행을 줄인다

논리 연산자는 참·거짓을 피연산자와 결과로 사용한다. 강의의 C·C++ 우선순위에서는 &&||보다 높다. 따라서 true || true && falsetrue || (true && false)로 묶인다.

단락회로 계산은 일부 피연산자를 계산하지 않고 결과를 결정하는 방식이다. true || ...는 오른쪽과 무관하게 참이고, false && ...는 오른쪽과 무관하게 거짓이다.

int safe = (denominator != 0)
           && (total / denominator > 3);

이 학습용 예에서 denominator가 0이면 첫 조건이 거짓이므로 오른쪽 나눗셈은 평가하지 않는다. 단락회로는 결과만 빨리 정하는 규칙이 아니라 오른쪽 수식의 함수 호출이나 오류 가능 연산이 실제로 실행되지 않을 수 있다는 실행 규칙이다.

수식 평가는 괄호·타입·값·상태 순으로 검산한다

  1. 수식 확인: 전체 표현이 어떤 값을 나타내는지, 문장이라면 어느 수식이 포함되었는지 찾는다.
  2. 괄호 복원: 후위, 전위·단항, 곱셈층, 덧셈층, 관계층, 논리층 순으로 우선순위를 적용하고 같은 층은 결합방향으로 묶는다.
  3. 타입 기록: 각 부분식의 입력 타입과 묵시적·명시적 변환 위치를 적는다.
  4. 부분값 계산: 안쪽 부분식부터 값과 결과 타입을 갱신한다.
  5. 상태 검산: 전위·후위 변화와 단락회로로 건너뛴 피연산자를 따로 표시한다.

평가표 복습: 수식은 값을 나타내며, 문장은 처리를 지시한다. 연산자 수가 늘어나면 우선순위와 결합방향으로 괄호를 복원하고, 서로 다른 타입은 변환한 뒤 연산한다. 관계 연산은 논리값을 만들고, 논리 연산은 우선순위와 단락회로에 따라 일부 계산을 생략할 수 있다.

한 번 더 풀 때: 눈으로 바로 계산하지 말고 수식 아래에 네 줄을 만든다. 첫 줄에는 괄호, 둘째 줄에는 타입, 셋째 줄에는 부분값, 넷째 줄에는 변수 변화와 미실행 부분을 적으면 같은 절차로 산술·관계·논리 수식을 모두 검산할 수 있다.

예상문제

1. 수식에 대한 설명으로 가장 적절한 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②

  • ① 오답: 상수나 변수 하나도 값을 나타내므로 연산자 없이 수식이 될 수 있다.
  • ② 정답: 구성 기호의 수보다 최종적으로 값을 나타내는지가 수식의 핵심 기준이다.
  • ③ 오답: 수행 흐름 변경은 문장이 나타내는 처리의 사례다.
  • ④ 오답: C·C++에서 세미콜론은 수식을 수식문으로 만드는 문법 요소다.

2. 수식과 문장의 차이를 옳게 설명한 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④

  • ① 오답: 값과 처리의 역할을 서로 뒤바꾸어 설명했다.
  • ② 오답: if 같은 문장은 세미콜론을 제거해도 수식으로 바뀌지 않는다.
  • ③ 오답: 값을 반환하는 함수 호출은 그 반환값을 나타내는 수식이 될 수 있다.
  • ④ 정답: 표면 기호가 아니라 값 표현과 처리 지시라는 기능 차이를 정확히 구분했다.

3. C·C++의 강의 우선순위에 따라 6 + 4 * 2 - 3을 계산한 값은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①

  • ① 정답: 곱셈을 먼저 계산해 6+8-3으로 만들고 좌결합으로 11을 얻는다.
  • ② 오답: 덧셈을 먼저 묶은 뒤 곱한 결과로 우선순위를 거꾸로 적용했다.
  • ③ 오답: 6+8까지만 계산하고 마지막 뺄셈을 누락했다.
  • ④ 오답: 곱셈층과 덧셈층의 괄호 복원 과정에 맞지 않는 값이다.

4. 덧셈과 뺄셈의 좌결합을 적용한 9 - 3 + 2 - 4의 값은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③

  • ① 오답: 가운데 3+2를 임의로 먼저 묶으면 원래 좌결합 수식과 달라진다.
  • ② 오답: 좌결합의 중간값 6과 8을 정확히 이어 계산하지 않았다.
  • ③ 정답: ((9-3)+2)-4로 묶으면 6→8→4가 된다.
  • ④ 오답: 뺄셈 부호를 덧셈처럼 처리한 경우에 가까운 값이다.

5. i=6에서 -i++를 평가한 수식 결과와 평가 뒤 i는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②

  • ① 오답: 이는 증가한 값을 먼저 사용하는 -++i의 결과다.
  • ② 정답: 후위 증가는 현재 값 6을 먼저 내놓아 부호를 바꾸고, 그 뒤 저장값을 7로 만든다.
  • ③ 오답: 후위 증가를 감소로 바꾸고 단항 부호의 결과도 반대로 해석했다.
  • ④ 오답: 후위 증가의 상태 변경과 단항 음수 연산을 모두 누락했다.

6. 7.5 * 4(int)7.5 * 4의 평가를 옳게 비교한 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④

  • ① 오답: 첫 수식은 실수 피연산자에 맞춰 확대되며 둘째 수식은 소수부가 사라진다.
  • ② 오답: 두 변환이 적용되는 피연산자와 결과를 서로 바꾸었다.
  • ③ 오답: 축소 캐스팅은 7.5를 7로 바꾸므로 이후 곱셈 결과도 달라진다.
  • ④ 정답: 묵시적 확대와 명시적 축소가 연산 입력을 어떻게 바꾸는지 정확히 추적했다.

7. C·C++식 평가에서 9 / 2 >= 4.2의 결과와 근거는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③

  • ① 오답: 두 피연산자가 정수인 나눗셈이 먼저 실행되어 소수부가 생기지 않는다.
  • ② 오답: 산술 나눗셈은 관계 연산보다 우선순위가 높다.
  • ③ 정답: 4를 실수로 확대해도 4.0일 뿐 이미 잃은 0.5가 복원되지 않는다.
  • ④ 오답: 이 비교에서 실수 4.2를 정수로 반올림하는 묵시적 변환은 적용되지 않는다.

8. 4 > 1 == 8 - 5 > 2를 강의의 우선순위로 평가한 결과는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①

  • ① 정답: 8-5 뒤 두 대소 비교가 모두 참이고 마지막 true==true도 참이다.
  • ② 오답: 산술, 대소 관계, 동등 관계의 층을 순서대로 적용하면 두 논리값이 일치한다.
  • ③ 오답: 3은 중간 산술 부분식의 값이며 전체 수식의 최종 결과가 아니다.
  • ④ 오답: 전체 결과는 관계·동등 연산을 거친 논리값으로 해석해야 한다.

9. (denominator != 0) && (total / denominator > 3)에서 denominator가 0일 때 옳은 설명은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①

  • ① 정답: false && ...의 결과는 이미 거짓이므로 오류 가능 나눗셈을 건너뛴다.
  • ② 오답: 단락회로의 목적은 왼쪽만으로 결과가 정해질 때 오른쪽 평가를 생략하는 것이다.
  • ③ 오답: 생략되는 것은 표기만이 아니라 오른쪽 피연산자의 실제 평가다.
  • ④ 오답: 논리곱은 두 피연산자가 모두 참일 때만 참이다.

10. 여러 연산자와 타입 변환이 섞인 수식을 가장 안정적으로 푸는 절차는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③

  • ① 오답: 괄호를 늦게 확인하면 높은 우선순위 연산을 잘못 묶은 계산을 되돌려야 한다.
  • ② 오답: 변환은 언어 규칙과 캐스팅 위치에 따라 정해지며 연산자 의미도 결과를 좌우한다.
  • ③ 정답: 괄호·타입·값·상태의 평가표를 순서대로 채워 계산과 실행 여부를 함께 검산한다.
  • ④ 오답: 강의의 우선순위에서는 산술 연산이 관계·논리 연산보다 먼저 묶인다.

참고 자료와 작성 기준

이 글은 해당 차시 강의자료를 바탕으로 학습 목적에 맞게 재구성한 비공식 학습자료입니다. 네 단계 평가표, 전위·후위 상태 장부, 형 변환과 단락회로 추적은 학습자의 이해를 돕도록 구성하고 검토했습니다.

  • 작성·편집: 올에이클래스 학습연구팀
  • 주요 근거: 한국방송통신대학교 컴퓨터과학과 프로그래밍언어론 제11강 「수식」 강의자료(2025)
  • 보충 자료: 별도의 외부 자료를 사용하지 않음
  • 편집 원칙: 올에이클래스 편집 정책
  • 최종 내용 검토: 2026-08-29

댓글