Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

KNK Chap.4 (4.4~4.5) 본문

C

KNK Chap.4 (4.4~4.5)

Daryl 2022. 12. 14. 20:06

4.4 표현식 평가

↑ 지금까지 다룬 연산자들. 

 

아래의 예시를 연산자 순서대로 괄호를 이용해 하나의 피연산자처럼 처리해보자.

a = b += c++ - d + --e / -f

우선순위 1위: 후위 ++ 연산자 

→ a = b += (c++) - d + --e / -f

 

2순위 전위 -- 연산자, 단항음수연산자

→ a = b += (c++) - d + (--e) / (-f)

 

3순위 / 연산자

→ a = b += (c++) - d + ((--e) / (-f))

여기 보면 두 연산자 -, + 가 d를 공유하고 있음. 결합방향을 고려해야 함.

- 와 + 는 왼쪽에서 오른쪽으로 결합하므로 괄호는 뺄셈 먼저, 그 뒤에 덧셈을 처리함.

→ a = b += (((c++) - d) ((--e) / (-f)))

마찬가지로 b를 공유하고 있는 = 와 +=를 처리하면 됨. 

결합방향을 확인하면 할당연산자는 오른쪽에서 왼쪽으로 괄호로 묶으므로 += 로 먼저 묶음.

→ (a = (b += (((c++) - d) ((--e) / (-f)))

표현식 괄호로 완벽하게 묶기 완성.

 

값을 표현할 때의 부분식 순서

C언어에서, 부분식이 피연산자를 수정하면 부분식 평가 순서에 따라 표현식의 값 변화 가능. 예시↓

a = 5;
c = (b = a + 2) - (a = 1);

 

두번째 구문의 실행은 정의되지 않음.

부분식 (b = a + 2)를 먼저 평가했다면 b는 7, c는 6임.

하지만 (a = 1)를 먼저 평가했다면 b는 3, c는 2임.

 

[!!!] 표현식 내에서 변수의 값에 접근하고 수정하는 과정이 일어나는 표현식은 지양하기.

 

부분식에선 할당연산자는 지양하는게 좋음. 할당은 여러 줄에 걸쳐 진행하는게 좋음

위 코드는 아래와 같이 다시 짤 수 있음.

a = 5;
b = a + 2;
a = 1;
c = b - a;

이게 실행되면 c의 값은 언제나 6임.

 

할당연산자 이외에 피연산자의 값을 수정하는 연산자는 증감연산자임.

이 연산자를 사용할 땐, 표현식의 평가가 어떤 특정 순서를 따르지 않는다는 사실을 명심.

아래의 예시를 보면 j의 값이 두가지가 나올 수 있음.

i = 2;
j = i * i++;

구문 실행 시 절차가 정의되지 않았으므로, j의 값은 4가 될 수도, 6이 될 수도 있음.

6이 나오는 절차:

1. 두번째 피연산자인 i의 본래 값을 선택하고 i를 증가함. → 3

2. 첫번째 피연산자인 새로운 i의 값이 선택되고 본래 i값과 곱해짐. → 2 * 3

3. 본래 값과 새 값이 곱해지고 결과는6이 나옴. 

 

변수를 선택한다Fetching는 것은, 메모리로부터 변수의 값을 갖고 온다는 것임.

나중에 변수에 변화가 가해져도 선택된 값에 영향을 주지 않음.

여기서 선택된 값은 보통 레지스터register라는 CPU 내 특수 공간에 보관됨.

 

[정의되지 않은 행동/ 불능행동]

C 표준에 의하면, 위와 같은 구문들은 불능행동undefined behavior를 초래한다고 함.

구현정의행동과는 다르고 결과를 예측할 수 없음. 컴파일러마다 다른 값을 내놓을 것임.

애초에 컴파일이 안될 수도 있고... 불능행동은 절대 피하기.

 

 

4.5 표현문

C에선 모든 표현식이 구문으로 사용될 수 있다는 규칙이 있음.

즉, 무슨 형식이든, 무슨 값을 처리하든 표현식 끝에 세미콜론; 을 추가하면 구문이 됨.

예를 들어,

++i;

이 구문이 실행되면 i는 증가되고, 증가된 새로운 i 값이 마치 다음 표현식에 쓰일 것처럼 선택됨.

하지만 쓰일 곳이 없기 때문에 선택된 값은 버려지고 다음 구문이 실행됨.

그래서 부작용이 있지 않는 한 굳이 표현식을 구문처럼 이용할 필요는 없음.

 

 

 

 

 

 

'C' 카테고리의 다른 글

KNK Chap.5 (5.1)  (0) 2022.12.15
KNK Chap.4 (Q&A)  (0) 2022.12.14
KNK Chap.4 (4.2~4.3)  (0) 2022.12.14
KNK Chap.4 (4.1)  (0) 2022.12.14
KNK Chap.3 (Q&A)  (0) 2022.12.14
Comments