Expression
표현식
- 값과 연산자들을 적절히 조합하여 표현식을 만들 수 있다.
- Assignment Expression(대입 표현식), Relational Expression(관계 표현식) 등으로 구분된다.
- C++에서는 모든 표현식이 그 자체로 하나의 값을 가진다.
Assignment Expression
대입 표현식
- 말 그대로, 변수에 값을 대입시키는 표현식이다.
- C++은 좌변의 값을 대입 표현식의 값으로 정의한다.
x = y = z = 0
- 위 표현식은 z에 0이 대입, y에 z가 대입, x에 y가 대입된다.
- 이 표현식 자체의 값은 변수 x의 값, 즉 0이다.
* Side Effect (부수 효과)
x = 100
- 위 표현식에서 C++은 변수 x에 100을 대입하게 된다.
- 표현식의 값을 평가하려는 목적이 메모리에 있는 데이터 값의 변경을 부수적으로 가져오는 모양에서 이를 부수 효과라고 부르게 되었다. (대입 표현식을 평가하게 되면 데이터의 값이 변경되는 점을 부수 효과로 본 것이다.)
- C++의 설계 구조상, 대입 표현식의 목적은 대입이 아니라 그 표현식 자체를 평가하는 것이다.
- 그러나 \(x + 15\)와 같은 표현식처럼 모든 표현식이 부수 효과를 가지는 것은 아니다.
(x의 값 자체가 변하진 않기 때문이다.)
* Bug Prevention (== Operator vs = Operator)
- == 연산자(같다)와 = 연산자(대입)는 프로그래머의 실수로 인해 논리 오류(컴파일러가 문제삼지 않고 진행시킴)를 발생시키기 쉽고, 컴파일러가 이를 감지해서 미연에 방지하기는 쉽지 않다.
- 따라서 ==연산자를 사용할 경우, 흔히 쓰는 \(Variable == Value\) 방식의 표현식보다는,
\(Value == Variable\) 방식의 표현식을 쓰는 것이 프로그래머가 놓치더라도 컴파일러가 거르게 하는 좋은 방법이다.
(후자의 표현식으로 표현할 경우 == 연산자 대신 = 연산자를 써도 오류로 인해 제대로 실행되지 않는다.)
"일반적으로, 컴파일러가 에러를 쉽게 찾을 수 있도록 프로그램을 작성하는 것이 찾기 어려운 에러를 만들어 놓고 이를 고치느라 애를 먹는 것보다 훨씬 낫다."
Expression vs Statement
표현식 vs 구문
- 표현식의 끝에 세미콜론(;)을 붙이면 구문이 된다.
- 모든 표현식을 세미콜론을 붙여 구문으로 만들 수 있다.
- 그러나 표현식에 세미콜론을 붙인다고 해서 모든 구문이 의미(기능)를 갖는 것은 아니다.
- 또한, 구문에서 세미콜론을 제거한다고 해서 무조건 표현식이 되는 것도 아니다. (return 구문, 선언 구문, for 구문 등)
rodents + 6;
- 위 구문에서, 변수 \(rodents\)에다가 6을 더하게 된다. 하지만 프로그램은 단순히 그 합을 계산하고 아무런 후속 조치를 취하지 않은 채 다음 구문으로 제어를 넘길 것이므로 이 구문은 아무 의미가 없다.
- 우수한 컴파일러라면 성능 향상을 위해 애초에 이런 구문은 무시할 것이다. (실행하지 않더라도 문제가 생기지 않으므로)
Sequence Point
시퀸스 포인트
- 프로그램의 실행이 다음 단계로 넘어가기 전에 모든 Side Effect (부수효과)들이 확실하게 평가되는 포인트이다.
- C++에서는 구문끝의 세미콜론(;)이나 Full Expression(완전 수식) 그 자체(완전 수식의 끝)로 시퀸스 포인트를 표시한다.
+ 여기서, 완전 수식이란 더 큰 수식의 부분 수식이 아닌 수식을 의미한다.