gimmesilver's blog

Agbird.egloos.com

포토로그



연산자 우선 순위... 프로그래밍

 어린 시절 산수 시간에 우리는 덧셈/뺄셈 보다 곱셈/나눗셈을 먼저 계산해야 한다고 배웠습니다. 그래서 4*3+2 나 2+3*4 은 14 입니다. 하지만 그 당시 산수 시험을 보면 아무 생각없이 뒤에 문제를 20이라고 계산하고선 나중에 채점된 시험지를 보며 안타까워하곤 했죠. 나름 그 당시에는 덧셈문제에서의 자리올림 빼먹는 것과 더불어 제 발목을 잡던 주요 실수 중 하나였습니다. 근데 정작 맨날 틀려서 안타까워하면서도 왜 곱셈/나눗셈을 덧셈/뺄셈보다 먼저 계산해야 하는지 그 이유에 대해서는 깊이 생각해본 적이 없었습니다.

두 온 아흔 넷. 정말로 진지하게 궁금한 수학적 의문
사칙 연산의 순서에 대해...
사칙연산과 괄호

 위에 링크된 글에 의하면 표기체계의 편리함을 위해 약속된 규칙이라고 할 수 있겠습니다.

 사실 사칙연산의 우선순위야 그 규칙이 단순하기 때문에 별 문제가 없지만 여러 가지 연산자들의 우선 순위를 모두 외워서 사용하는 것은 헷갈리는 일이고 그래서 실수하기 쉽습니다. 프로그래밍 언어를 배울 때도 가장 먼저 배우는 것 중 하나가 연산자 우선순위표였죠 하지만 워낙 다양한 연산자가 있고 우선 순위 레벨도 다양하기 때문에 보통은 괄호를 사용해서 명시적으로 우선 순위를 표기합니다. 그러다보니 이런 우선 순위가 의미가 없을때도 있습니다.

 프로그래밍 언어중에 J 라는 언어가 있는데 이 언어는 연산자 우선순위가 없습니다. 모든 연산이 오른쪽 우선(rightmost first) 규칙으로 이루어집니다. 그래서 J 언어에서는 4*3+2 는 20 이지만 2+3*4 는 14 입니다. 이렇게 한 가장 큰 이유는 역시나 프로그래머가 일일이 연산자의 우선 순위를 기억하지 않아도 되기 때문입니다. 그렇다면 왜 하필 오른쪽 우선일까요? 보통 직관적으로 볼 때는 왼쪽부터 계산하는 것이 더 자연스러운데 말이죠...그 이유는 J 언어(그리고 거의 대부분의 프로그래밍 언어)에서는 함수 계산 시 입력 인자들을 오른쪽에 표기하고 계산하기 때문에 오른쪽 우선 연산 규칙을 적용하면 여러 연산을 연이어 수행하는 식을 표기하기 쉽기 때문입니다.
 예를 들어 J 언어에서 어떤 수의 제곱을 구하는 연산자는 *: 입니다. 즉, *:3 은 9 입니다. 이 때 '3의 제곱과 1을 더해라' 라는 식은 다음과 같이 표기할 수 있습니다.
1 +*: 3
 위 식을 오른쪽부터 차례로 계산하면 3을 제곱(*:)하고 1과 더하는(+) 것이기때문에 10이 나옵니다. 비슷하게 C 언어의 ++ 연산자에 해당하는 것이 J에서는>: 이며 따라서 위 식은 아래와 같이 고쳐 쓸 수 있습니다.
>:*:3
 역시 여기서도 >: 연산자와*: 연산자의 우선 순위에 대해 고민할 필요가 없이 가장 오른쪽에 있는 인자 3에 대해서 순서대로 *:>: 연산를 적용하면 됩니다.
 심지어 J언어는 연산자에서 기본적으로 map 기능을 지원하기 때문에 이런식으로 우선순위 고민없이 오른쪽부터 차례대로 연산자를 나열하는 방식을 사용하는 것이 더 큰 장점이 될 수 있습니다. 가령 1부터 10까지의 수를 제곱한 총합을 구하는 식은 다음과 같습니다.
+/*:>:i.10
 참고로 위 식은 다음과 같이 계산됩니다.
1) i.10 => i. 함수는 index를 뜻하며 0부터 10개의 인덱스값을 반환함(즉, 0 1 2 3 4 5 6 7 8 9)
2) >: => 0 1 ... 7 8 9 에 각각 >: 연산 적용, 1 2 3 ... 8 9 10 이 됨
3) *: => 1 ~ 10 을 각각 제곱, 1 4 9 ... 100 이 됨
4) +/ => 3)에서 나온 배열을 합함

 역시 연산자 우선 순위라는 것은 해당 사용 언어의 표기체계에서의 편의성을 위해 정해진 약속일 뿐입니다.

핑백

  • gimmesilver's blog : 48÷2(3+9) = ? 2011-04-11 19:30:58 #

    ... 48÷2(3+9) 의 답이 뭐냐는 문제가지고 월요일 아침부터 여기 저기 시끌거린다. 예전에 연산자 우선 순위에 대해 쓴 글(http://agbird.egloos.com/4254808)에서도 언급했듯이 우선 순위는 그냥 사람들끼리 괄호 좀 적게 쓰려고 정한 규칙일 뿐 특별히 수학적으로 심오한 의미는 없다. 이게 ... more

덧글

댓글 입력 영역