가장 간단한 연산자인 더하기 기호(+)부터 시작해 보겠습니다. 더하기 기호(+)는 이진 연산자입니다. 즉, 더하기 기호는 세 번째 이상의 숫자를 연결하지 않고 두 숫자만 연결합니다.
따라서 "1 더하기 2 더하기 3"은 컴퓨터에서 다음과 같이 표현됩니다.
(1 + 2) + 3 // 또는
1 + (2 + 3) // b보통 1 + 2 + 3이라고 쓰지만, 수학적으로 1+2+3과 같다는 뜻은 아닙니다.
그렇다면 수학에서 1+2+3은 a 또는 b를 나타냅니까?
컴퓨터의 평가가 왼쪽 연관이면 이 표현식은 첫 번째 유형 a와 동일합니다. 오른쪽 연관이면 이 표현식은 두 번째 유형 b와 동일합니다.
1 + 2 + 3의 간단한 이해는 "1, 2, 3을 더하는 것"입니다. 실제로 우리가 접하는 수학에서는 세 개의 숫자를 더하는 것입니다. 그러나 프로그래밍 언어에서는 그것만이 아닙니다.
앞서 언급했듯이 + 기호는 3개 이상의 숫자에 대해서는 연산을 할 수 없으며, 2개의 숫자에 대해서는 덧셈 연산에만 참여할 수 있습니다.
그런데 더하기와 빼기는 이항 연산자인 덧셈과 뺄셈과 동일한 기호를 사용하지만 실제로는 +4가 0+4와 동일하다고 당연하게 여기지 마십시오. 그들은 동등하지 않습니다.
+4는 정수이지만 0+4는 정확히 +4로 평가되는 덧셈 표현식입니다.
Java에서는 short a = +4를 작성할 수 있지만 short a = 0 + 4를 작성하면 경고가 생성됩니다.
짧은 예에 관한 또 다른 예가 있습니다.
짧은 b = 1;
짧은 b = b + 4 // 경고
short b += 4; // 경고가 없습니다. 그러면 1 + 2 + 3은 어떻게 작동합니까? 폰 노이만 아키텍처의 프로그래밍 언어에는 사이드 이펙트(Side Effect)가 있습니다. 저는 이것을 "컴퓨터의 컴퓨팅 프로세스가 프로그래머의 두뇌의 사고 프로세스와 다를 때 사이드 이펙트(Side Effect)"라고 부르곤 했습니다. 책에는 이렇게 쓰여 있지 않습니다.) 예, 하지만 저는 항상 그렇게 생각했습니다. 원래는 이렇게 될 것이라고 생각했지만, 알고 보니 컴퓨터는 이것을 하지 않는 것을 부작용이라고 부릅니다.
이전 "문장 및 표현식"을 읽었다면 다음과 같이 이해할 수 있습니다.
1 + 2는 반환 값이 3인 표현식입니다. 그런 다음 이 표현식의 반환 값은 다른 표현식 3 + 3에 추가되고 최종 결과는 6입니다.
다음 명령문을 사용하여 이 코드를 다시 작성합니다.
// 1 + 2 + 3을 계산합니다.
var a = 1 + 2;
var b = a + 3; 이 표현식을 lisp에서 평가하면 부작용이 없습니다.
(+ (+ 1 2) 3) 아직 이해가 안 가시거나 이 예시가 너무 특별하다면 다른 예시로 바꿔보겠습니다.
5 > 4 > 3 수학에서 이 방정식은 참으로 평가됩니다. 이 코드를 C 언어로 작성하면 실제로 false가 반환됩니다.
이유는 위와 같습니다. 보다 큼 기호(>)는 이진 연산이므로 5 > 4에서 반환된 결과는 true가 1로 변환됩니다. 1 > 3이면 최종 결과는 당연히 거짓입니다.
간단히 말해서 "문 및 표현식" 기사의 관점으로 돌아가 보겠습니다. 프로그래밍 언어의 모든 표현식에는 값이 있습니다.
프로그래밍 언어의 연산자는 수학의 연산자와 동일하지만 동일하지는 않습니다. 프로그램을 작성할 때는 사람들이 읽을 수 있도록 작성하고, 프로그램을 디버그할 때는 컴퓨터 방식으로 코드의 의미를 생각하는 방법을 배워야 합니다.
나는 연산자를 함수로 이해하는 데 익숙합니다. 예를 들어 2 + 5는 실제로 add(2, 5) 또는 2.add(5)입니다. "실제로 많은 언어가 이렇게 한다"고 비밀리에 말씀드릴까요?