Notice
Recent Posts
Recent Comments
Link
«   2026/02   »
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
Tags
more
Archives
Today
Total
관리 메뉴

KNK Chap.5 (5.2) 본문

C

KNK Chap.5 (5.2)

Daryl 2022. 12. 15. 21:03

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
Comments