# [프로그래밍 언어] 4. Expressions and Assignment Statements

## 타입 변환

---

### 축소 변환 vs 확장 변환

- **축소 변환**: 근사치 값으로조차 저장할 수 없는 타입으로 변환         e.g. double → float

- **확장 변환**: 모든 값들의 근사치를 포함할 수 있는 타입으로 변환    e.g. int → float

### 명시적 vs 묵시적

```
i = (int) angle; // 명시적 타입 변환
a = 1 + 1.5;     // 묵시적 타입 변환: 정수 1을 실수로 확장 변환
```

- **명시적 타입 변환:** C, Java의 typecast

- **묵시적(강제적) 타입 변환**: 컴파일러에 의해 수행 → Java에서 오류로 탐지하지 않음

    - **혼합형 식**: 하나의 연산자 → 서로 다른 타입의 피연산자 → 묵시적 타입 변환 필요

## 관계식과 불리안 식

---

- **관계식**: 두 피연산자의 값을 비교 → 결과값은 불리안 (C언어는 수치값)

    - 동등, 비동등 관계 연산자를 사용 (산술연산자보다 낮은 우선순위)→ 언어 마다 다름

- **불리안**: 불리안 변수, 불리안 상수, 관계식, 불리안 연산자 (AND>OR)

    - C언어는 불리안이 없음 → 0이면 거짓 (a>b>c의 경우 두 번째 연산이 진행되지 않음)

## 단락회로 평가

---

```
while((index < listen) & (list[index] != key)){}
// 단락회로: (index < listen)이 거짓 -> 뒤의 조건 비교 X
// 비단락회로: 항상 뒷부분도 비교 -> 첨자 이탈 예외 발생 가능
```

- **단락회로**: 모든 피연산자와 연산자를 평가하지 않고 결정

- **비단락회로**: 모든 연산자와 피연산자를 비교

## 배정문

---

```
if (x=y)          // C: x에 할당된 값 -> y=0인 경우 거짓, 그 외 참
                          // Java: 불리안 식만 가능 -> 컴파일러, 인터프리터 오류
a = b + (c=d/b)-1 // c는 d/b로 업데이트
sum = count = 0;  // sum와 count 모두에 0이 삽입
```

- **배정문**: 변수에 대한 값의 바인딩 동적 변경

- **단순 배정문**: 동등 기호(=)를 주로 사용

- **복합 배정 연산자**: 필요한 형식을 명세하는 축약     e.g. sum+=value

- **단항 배정 연산자**: C, Java의 ++과 -- → 연산 처리 순서에 따라 결과가 달라짐

- **식으로서의 배정문**

    - C, Java 배정문 결과를 생성하여 목적지에 할당

    - 배정 연산자는 왼쪽 피연산자를 변경

    - 다중 목적지 배정 효과

## 혼합 배정문

---

- **C, C++**은 **확장, 축소**에 상관 없이 타입 강제 변환 규칙 사용

- **Java**에서는 **확장인 경우**에만 타입 강제 변환 허용

## 타입 변환

---

### 축소 변환 vs 확장 변환

- **축소 변환**: 근사치 값으로조차 저장할 수 없는 타입으로 변환         e.g. double → float

- **확장 변환**: 모든 값들의 근사치를 포함할 수 있는 타입으로 변환    e.g. int → float

### 명시적 vs 묵시적

```
i = (int) angle; // 명시적 타입 변환
a = 1 + 1.5;     // 묵시적 타입 변환: 정수 1을 실수로 확장 변환
```

- **명시적 타입 변환:** C, Java의 typecast

- **묵시적(강제적) 타입 변환**: 컴파일러에 의해 수행 → Java에서 오류로 탐지하지 않음

    - **혼합형 식**: 하나의 연산자 → 서로 다른 타입의 피연산자 → 묵시적 타입 변환 필요

## 관계식과 불리안 식

---

- **관계식**: 두 피연산자의 값을 비교 → 결과값은 불리안 (C언어는 수치값)

    - 동등, 비동등 관계 연산자를 사용 (산술연산자보다 낮은 우선순위)→ 언어 마다 다름

- **불리안**: 불리안 변수, 불리안 상수, 관계식, 불리안 연산자 (AND>OR)

    - C언어는 불리안이 없음 → 0이면 거짓 (a>b>c의 경우 두 번째 연산이 진행되지 않음)

## 단락회로 평가

---

```
while((index < listen) & (list[index] != key)){}
// 단락회로: (index < listen)이 거짓 -> 뒤의 조건 비교 X
// 비단락회로: 항상 뒷부분도 비교 -> 첨자 이탈 예외 발생 가능
```

- **단락회로**: 모든 피연산자와 연산자를 평가하지 않고 결정

- **비단락회로**: 모든 연산자와 피연산자를 비교

## 배정문

---

```
if (x=y)          // C: x에 할당된 값 -> y=0인 경우 거짓, 그 외 참
                          // Java: 불리안 식만 가능 -> 컴파일러, 인터프리터 오류
a = b + (c=d/b)-1 // c는 d/b로 업데이트
sum = count = 0;  // sum와 count 모두에 0이 삽입
```

- **배정문**: 변수에 대한 값의 바인딩 동적 변경

- **단순 배정문**: 동등 기호(=)를 주로 사용

- **복합 배정 연산자**: 필요한 형식을 명세하는 축약     e.g. sum+=value

- **단항 배정 연산자**: C, Java의 ++과 -- → 연산 처리 순서에 따라 결과가 달라짐

- **식으로서의 배정문**

    - C, Java 배정문 결과를 생성하여 목적지에 할당

    - 배정 연산자는 왼쪽 피연산자를 변경

    - 다중 목적지 배정 효과

## 혼합 배정문

---

- **C, C++**은 **확장, 축소**에 상관 없이 타입 강제 변환 규칙 사용

- **Java**에서는 **확장인 경우**에만 타입 강제 변환 허용

For the site tree, see the [root Markdown](https://slashpage.com/yerim-devnote.md).
