Unary - prefix or postfix
: cnt++
Binary - infix
: a + b
Base: left to right
except: "**" right to left
average = (count == 0) ? 0 : sum / count
[Evaluate as following]
if (count == 0)
average = 0
else
average = sum /count
말 그대로 평가(evaluation)의 순서에 따라 의미가 변화한다.
이는 다음과 같은 예시로 쉽게 설명 가능하다.
a = 10;
b = a + fun(a);
이때, fun()이라는 함수가 a를 변화시키는 함수라면 문제가 발생한다.
int a = 5;
int fun1(int param) {
a = 17;
return 3;
}
void main() {
a = a + fun1();
}
이렇게 된다면 두 가지 상황이 발생한다.
1) a가 먼저 evaluate
8
2) fun1()이 먼저 evaluate
20
위에서 언급한 문제점과 일맥상통한 문제일 수 있다.
이 개념은 '함수적 부작용(위에서 언급)'과 관련되고 영향을 받는다.
result1 = (fun(a) + b) / (fun(a) – c);
temp = fun(a);
result2 = (temp + b) / (temp – c);
fun()이 b와 c를 변형시키지 않는다면 result 1과 2는 동일한 값이어야 한다.
만약 부작용이 발생한다면 프로그램의 참조 투명성을 위반한다고 표현한다.
- Loss of compiler error dection
- Loss of readability
(still writing now...)
ex. Scope
double
[------------------------]
float
[-------------------]
int
[-------------]
- narrowing conversion
위에서 아래로: scope가 줄어듦.
handling 할 수 없는 범위가 있으면 >> 정보 소실 (causes Trouble)
- widening conversion
아래에서 위로: scope가 늘어남.
정보 소실의 위험이 없음 >> 안전함.
"Cast"
: Coercion
: implicit type conversion
-> Decrease in the [type error detection] ablility of the complier