일
KNK Chap.5 (5.2) 본문
5.2 if문
if문은 간단히 표현하면 아래와 같음.
if ( expression ) statement
괄호는 표현식의 일부분이 아니라 if문의 일부분이므로 필수임.
if문이 실행되면 괄호 안의 표현식이 평가됨.
표현식의 값이 0이 아닌 참이라면 괄호 뒤 구문 실행됨. 예시 ↓
if (line_num == MAX_LINES)
line_num = 0;
구문 line_num = 0;은 조건 line_num == MAX_LINES가 참일 때만 실행됨.
[!!!] 동등==과 할당= 혼동하지 말기
if문은 어떤 변수가 특정 구간에 포함되는지 판별할 때 자주 사용됨.
예를 들어 0≤i<n 을 판단한다고 할 때 아래와 같이 코드를 작성함.
[관용구]
if (0 <= i && i < n) ...
반대로 i가 위 범위 밖에 있음을 판별하려면 다음과 같이 작성함.
[관용구]
if (i < 0 || i >= n) ...
&& 연산자가 아닌 || 연산자가 쓰임!
복합문
만약 if문이 하나의 구문이 아닌 여러 구문을 제어하게 만들고 싶다면, 복합문을 쓰면 됨.
복합문은 여러개의 구문을 중괄호로 감싼 형태임. 그럼 컴파일러는 그걸 하나의 구문 취급함.
{statements}
예를 들면 이렇게 생김
{
line_num = 0;
page_num++;
}
복합문 내의 구문이라도 세미콜론으로 꼭 끝나야 함.
복합문 자체는 세미콜론으로 끝나지 않음.
복합문만 중괄호를 쓰는건 아님.
if문이 한개의 구문만 있어도 중괄호를 해주는게 가독성에 좋음.
else 절
if문은 아래와 같이 else절을 포함할 수 있음.
if ( expression ) statements else statement
else 뒤에 나오는 구문은 괄호 안의 표현식 값이 0일 때 실행됨.
아까도 말했지만 구문은 세미콜론으로 끝나야 함.
예시를 하나 보면
if (i > j)
max = i;
else
max = j;
이런 식으로 안쪽 구문은 둘다 세미콜론으로 끝남.
그리고 위 예시엔 없지만 실무에선 항상 중괄호를 같이 씀.
if문이 중복될 때도 중괄호를 쓰면 가독성이 높아짐. 예시 ↓
if (i > j) {
if (i > k) {
max = i;
} else {
max = k;
}
} else {
if (j > k) {
max = j;
} else {
max = k;
}
}
계단식 if문
조건이 여러개일 때 계단식으로 if문을 사용하면 좋음.
예를 들어 n이 0보다 작은지, 같은지, 큰지 판별할 때 계단식 if문을 사용하면
if (n < 0) {
printf("n은 0보다 작다\n");
} else if ( n == 0) {
printf("n은 0과 같다\n");
} else {
printf("n은 0보다 크다\n");
}
이런 식으로 표현할 수 있음. 이걸 구조화하면 아래와 같음.
if ( expression ) {
statement
} else if ( expression ) {
statement
...
} else if ( expression ) {
statement
} else {
statement
}
마지막 두 줄(else와 statement)는 필수는 아님.
이런 방식을 차용하면 조건의 개수가 많아질 때 계단식 if문이 과도하게 들여써지는 것이 방지됨.
[프로그래밍] 중개 수수료 계산하기
주식 브로커가 아래와 같이 수수료를 책정한다고 치자.

최소 수수료는 $39.
사용자가 거리 규모를 입력하면 수수료를 출력하는 프로그램을 만들 것임.
계단식 if 문을 적절히 사용하여 거래 규모를 정확한 범위의 조건에 떨어지게 하는 것이 중요함.

누구의 else인가?
if문을 여러 겹으로 사용할 땐 else문을 조심해야 함.
C언어에선 들여쓰기와 상관없이 가장 가까운 else와 if가 서로 짝지어짐.
그래서 중괄호를 쓰는 게 중요함. 예를 들어
if (y != 0)
if (x != 0)
result = x / y;
else
printf("에러: y는 0과 같습니다\n");
이런 식으로 들여쓰기를 해도 else는 안의 if와 짝지어짐.
밖의 if와 else를 짝짓고 싶다면 이렇게 써야 함.
if (y != 0) {
if (x != 0) {
result = x / y;
}
} else {
printf("에러: y는 0과 같습니다\n");
}
중괄호는 아주 중요함.
조건 표현식
C의 if문은 조건의 결과값에 따라 한개 또는 여러 개의 행동을 할 수 있게 함.
C에선 표현식이 조건의 결과값에 따라 한개 또는 여러 개의 값을 만드는 연산자 존재함.
조건 연산자conditional operator는 ?와 : 로 구성되어 있고, 아래와 같이 동시에 사용됨.
expr1 ? expr2 : expr3
이 표현식 전체를 조건 표현식conditional expression이라고 부름.
세 가지의 피연산자가 있어야 하는 독특한 연산자이고, 삼중연산자ternary operator라고 부름.
이 조건표현식을 해석하면 "만약 expr1이면 expr2이고, 그 외의 경우엔 expr3이다".
왼쪽부터 평가가 진행됨. 만약 expr1의 결과값이 0이면 expr3이 조건표현식의 값이 됨.
만약 expr1의 결과값이 0이 아니라면 옆으로 넘어가 expr2를 평가함.
복잡한 연산자이니 예제를 통해 좀 더 살펴보겠음.
int i;
int j;
int k;
i = 1;
j = 2;
k = i > j ? i : j; /* k의 값은 2이다 */
k = (i >= 0 ? i : 0) + j; /* k의 값은 3이다 */
k의 첫 할당에 사용된 조건표현식 i > j ? i : j 는 k에 i 혹은 j 의 값을 둘의 대소관계에 따라 할당함.
i의 값은 1이고, j의 값이 2이므로, i > j 는 거짓임. 즉 조건표현식의 값은 2가 되고 k에 할당됨.
k의 두번째 할당에선 i >= 0이 참이므로, 조건표현식 (i >= 0 ? i : 0)의 값은 1이 되고 3이 k에 할당됨.
참고: 여기에 사용된 괄호는 필수임. 조건 연산자의 평가 순서는 가장 낮음.
조건 표현식은 프로그램을 간결하게 해주지만 가독성을 낮출 수 있음.
따라서 조건 표현식이 필요한 특정 경우에 쓰는 게 좋음. 예를 들어 return문이 있음.
return문에서 조건 표현식을 쓰면
if (i > j) {
return i;
} else {
return j;
}
이 코드를 아래와 같이 줄일 수 있음
return i > j ? i : j;
printf() 또한 좋은 예시 중 하나임. printf()에서 아래와 같은 코드가 있다 치면
if (i > j) {
printf("%d\n", i);
} else {
printf("%d\n", j);
}
다음과 같이 작성할 수 있음
printf("%d\n", i > j ? i : j);
C89에서의 불bool 방식의 값
int 변수를 정의해서 0 또는 1을 할당하는 방법이 있지만
int flag;
flag = 0;
...
flag = 1;
가독성이 좋진 않음.
그래서 TRUE와 FALSE라는 이름으로 매크로 정의를 함.
#define TRUE (1)
#define FALSE (0)
그러면 flag 변수의 참거짓이 좀 더 잘 보임
flag = FALSE;
...
flag = TRUE;
flag 변수가 참인지 판별하려면 아래와 같이 작성함
if (flag) ...
flag 변수가 거짓인지 판별하려면 다음과 같이 작성함
if (!flag) ...
이를 확장하여 타입type처럼 쓸 수 있는 매크로를 정의할 수도 있음
#define BOOL int
그럼 BOOL을 불리언형의 변수를 선언할 때 int 대신 사용할 수 있음
BOOL flag;
이렇게 해야 드디어 flag가 단순한 정수형 변수로 보이지 않고 확실한 불리언형으로 보임.
C99에서 불 방식의 값
C99에서는 _Bool 형식을 제공함. 그래서 간편히
_Bool flag;
라고 써주면 됨. _Bool은 무부호 정수형이고, 그렇기에 사실상 int형 변수임.
다른 점은 0과 1만 할당된다는 점. _Bool형 변수에 0이 아닌 값을 넣으면 1로 변환됨.
이뿐만 아니라 C99에서는 <stdbool.h>이라는 이름의 헤더파일도 제공함.
이 헤더파일에는 bool이라는 이름의 매크로가 존재하고, _Bool이라는 뜻임.
또한 true와 false라는 매크로도 갖고 있어서 이렇게도 쓸 수 있음.
flag = false;
...
flag = true;
<stdbool.h> 헤더는 매우 편리함.
'C' 카테고리의 다른 글
| KNK Chap.5 (Q&A) (0) | 2022.12.16 |
|---|---|
| KNK Chap.5 (5.3) (0) | 2022.12.15 |
| KNK Chap.5 (5.1) (0) | 2022.12.15 |
| KNK Chap.4 (Q&A) (0) | 2022.12.14 |
| KNK Chap.4 (4.4~4.5) (0) | 2022.12.14 |