C

KNK Chap.5 (5.1)

Daryl 2022. 12. 15. 19:20

05 선택문

지금까지 배운 구문은 return 구문과 표현문 총 2가지임.

C의 구문은 크게 3가지로 나뉨.

나뉘는 기준은 해당 구문이 다른 구문들을 실행할 때의 순서에 어떤 영향을 미치는가? 임.

 

○ 선택문selection statements:

if문, switch문. 이걸 쓰면 프로그램이 여러 방법 중 특정 방법을 실행시킴.

○ 반복문iteration statements:

while문, do문, for문. 반복(루프)하게 함.

○ 도약문jump statements:

break문, goto문, return문. 프로그램이 조건 없이 특정한 지점으로 가게 함.

 

이 외에는 복합문(여러개의 구문을 한 구문으로 만듦), null문(아무 행동을 안함)이 있음.

5단원에서는 선택문과 복합문을 다룰 것임.

 

5.1 논리표현식

 

C언어의 몇 가지 구문들은 표현식의 값이 참인지 거짓인지 반드시 확인해야 함(Ex. if문).

값이 1이면 참, 0이면 거짓 이런 식으로 나옴. 이걸 기억하면서 논리 연산자 배우면 됨.

 

관계 연산자

C에서 쓰는 관계 연산자relational operator는 표현식에서 사용될 때 결과값으로 0이나 1이 나옴.

예를 들어, 10 < 11 의 값은 1이고, 11 < 10 의 값은 0임.

관계 연산자는 정수 및 고정소수의 비교, 또는 둘을 섞어 비교할 때 사용할 수 있음. 

예를 들어, 1 < 1.1 의 값은 1이고, 1.8 < 1 의 값은 0임.

 

관계연산자의 평가순서는 산술 연산자보다 낮고, 좌향결합적임.

 

[!!!] C언어에서 i < j < k 와 같은 표현식은 실제 평가 시 의도와 다른 결과가 나올 수 있음.

< 연산자가 좌향결합적이기 때문임. 즉 (i < j) < k 꼴이 됨.

이건 결국 k가 0 또는 1보다 큰지 평가하는 식임. 

나중에 올바르게 표현식인 i < j && j < k 를 배울 것임.

 

동등 연산자

동등연산자equality operator는 좀 특이하게 생김.

= 하나만 쓰면 할당연산자이기 때문에 == 두개를 붙여서 씀.

동등연산자의 평가순서는 관계연산자보다 낮고, 좌향결합적임.

 

예를 들어 표현식 i < j == j < k(i < j) == (j < k) 와 같음.

i < j j < k 둘이 동시에 참이거나 거짓이면 위 표현식 또한 참임.

 

논리 연산자

논리 연산자logical operator는 and, or, not으로 구성됨.

! 연산자는 단항.

&& , || 연산자는 이항.

 

논리연산자는 결과값으로 0이나 1을 반환함.

0이 아닌 피연산자를 참으로, 0인 피연산자를 거짓으로 취급함.

 

○ !expr: expr의 값이 0이라면 1이다.

○ expr1 && expr2: expr1과 expr2가 둘다 0이 아닌 값이면 1이다.

○ expr1 || expr2: expr1 혹은 expr2, 혹은 둘다 0이 아닌 값이면 1이다.

 

이 외의 경우엔 전부 0을 값으로 가짐.

 

&&||은 피연산자를 평가할 때 왼쪽 피연산자를 우선 평가한 후 오른쪽 피연산자를 평가함.

이런 걸 단락식 평가라고 함.

만약 전체 표현식 값이 왼쪽 피연산자 하나로 결정난다면 오른쪽 피연산자는 평가 안함. 예시 ↓

(i ! = 0) && (j / i > 0)

우선 왼쪽 피연산자인 i ! = 0 을 평가해보자.

1. i가 0과 같지 않다면 (j / i > 0)을 평가해서 전체 표현식의 참거짓을 판별해야 함.

2. i가 0이라면 전체 표현식은 거짓임. 따라서 (j / i > 0)은 평가할 필요가 없음.

→ 단락식 평가가 아니었다면 오른쪽 피연산자에서는 값을 0으로 나누는 에러 발생 가능.

 

[!!!] 논리표현식도 부작용이 있을 수 있음.

그러나 &&과 ||은 단락성이 있어 피연산자에서 생기는 부작용은 피할 수 있음. 예시 ↓

i > 0 && ++j > 0

표현식을 평가할 때의 부작용으로 j는 증가되겠지만, 여기선 부작용이 발생하지 않음.

만약 i > 0 이 거짓이라면 j > 0은 평가되지 않고 j는 증가되지 않기 때문임.

 

! 연산자의 평가순서는 단항 덧셈/뺄셈과 같고, 우향결합적임.

&&, || 연산자의 평가순서는 관계연산자, 동등연산자보다 낮고, 좌향결합적임.

Ex. i < j && k == m 은 (i < j) && (k == m) 과 같음.