elevne's Study Note

C 공부 (2: 반복문, static) 본문

Backend/C

C 공부 (2: 반복문, static)

elevne 2023. 1. 27. 17:04

C 언어에서도 Java 와 동일한 방식으로 while 문을 사용하여 반복문을 구현할 수 있다.

 

 

 

#include <stdio.h>

int main() {
    int num = 0;
    while (num <= 10) {
        printf("HI \n");
        num++;
    }
}

 

 

 

 

반복문의 내용을 최소 한 번 이상 실행시키기 위해서 단순 while 문 대신에 do while 을 사용할 수도 있다.

 

 

 

#include <stdio.h>

int main() {
    int num = 0;
    do {
        printf("HI \n");
        num++;
    } while (num <= 10);
}

 

 

 

for 반복문도 Java 와 동일한 문법으로 작성하여 사용할 수 있다.

 

 

 

#include <stdio.h>

int main() {
    for  (int i = 0; i < 10; i++) {
        printf("HI\n");
    }
}

 

 

 

 

if 문의 경우도 마찬가지이다. (아래 코드에서는 작성하지 않았지만 당연히 else if 도 사용 가능하다. 그 외에도 switch/case 문도 사용 가능하다)

 

 

 

#include <stdio.h>

int main() {
    for  (int i = 0; i < 10; i++) {
        if (i > 4){
            printf("4보다 큼\n");
        } else {
            printf("4보다 작음\n");
        }
    }
}

 

 

result

 

 

 

삼항연산자도 아래와 같이 사용 가능하다.

 

 

 

#include <stdio.h>

int main() {
    int i = 0;
    int j = 1;
    int k = (i > j) ? i : j;
    printf("%d", k);
}

 

 

 

 

함수를 작성하는 방법도 (이전 글에서 알아보았던 것처럼) Java 와 매우 유사하다. 반환값이 없으면 함수 앞에 void 를 붙여주고, 있을 때에는 반환 값의 자료형을 붙여준다.

 

 

 

#include <stdio.h>

int Add(int num1, int num2){
    return num1 + num2;
}
void showAddResult(int num){
    printf("Add Result: %d\n", num);
}
int ReadNum(){
    int num;
    scanf("%d",&num);
    return num;
}
void HowTo(){
    printf("Write Two input integers to add");
}

int main() {
    int result, num1, num2;
    HowTo();
    num1 = ReadNum();
    num2 = ReadNum();
    result = Add(num2, num1);
    showAddResult(result);
    return 0;
}

 

 

result

 

 

 

이 때, 사용하는 함수는 호출되기 전에 미리 정의되어 있어야 한다. 함수의 선언만 위에서 하고 함수의 정의를 밑에서 다시 해주는 방법도 사용이 가능하다. 아래와 같이 바꿔줄 수 있는 것이다.

 

 

 

#include <stdio.h>
int Add(int, int);
void showAddResult(int);
void HowTo();
int ReadNum();


int main() {
    int result, num1, num2;
    HowTo();
    num1 = ReadNum();
    num2 = ReadNum();
    result = Add(num2, num1);
    showAddResult(result);
    return 0;
}

int Add(int num1, int num2){
    return num1 + num2;
}
void showAddResult(int num){
    printf("Add Result: %d\n", num);
}
int ReadNum(){
    int num;
    scanf("%d",&num);
    return num;
}
void HowTo(){
    printf("Write Two input integers to add");
}

 

 

 

 

또, 함수 내에서 지역변수를 사용할 때 static 선언을 사용할 수 있다. 본래 지역변수는 선언된 함수 내에서만 접근이 가능하고, 함수 내에 선언된 지역변수는 해당 함수가 반환하면 소멸된다. 하지만, static 선언을 사용하게 되면, 여전히 해당 지역변수는 선언된 함수 내에서만 접근 가능하긴 하지만, 딱 1 회 초기화되고 프로그램 종료 시까지 메모리 공간에 존재하게 된다. (전역변수의 특징을 갖게되는 것) 아래 코드로 확인해볼 수 있다.

 

 

 

#include <stdio.h>

void SimpleFunc(){
    static int num1 = 0;
    int num2 = 0;
    num1++, num2++;
    printf("static: %d, local: %d \n", num1, num2);
}

int main() {
    for (int i = 0; i < 10; i++){
        SimpleFunc();
    }
    return 0;
}

 

 

result

 

 

 

static 변수는 매우 쉽게 전역변수로 대체가 가능하기는 하지만, 전역변수보다 안정적이다. 전역변수와 마찬가지로 프로그램이 종료될 때까지 메모리 공간에 남아있지만 접근할 수 있는 범위를 하나의 함수로 제한했기 때문이다. 

 

 

또, 지역변수에는 static 말고 register 선언을 붙여줄 수도 있다. register int num = 3; 과 같은 형태로 작성해주는 것인데, 이처럼 선언된 변수 num 은 CPU 내에 존재하는 레지스터라는 메모리 공간에 저장될 확률이 높아지게 되는 것이다. 레지스터는 CPU 내에 존재하는 크기가 작은 메모리로, CPU 내에 존재하기에 이 메모리에 저장된 데이터를 대상으로 하는 연산은 매우 빠르게 이루어진다고 한다.

 

 

 

 

 

Reference:

윤성우의 열혈 c 프로그래밍

'Backend > C' 카테고리의 다른 글

C 공부 (6: Call by reference)  (1) 2023.03.07
C 공부 (5: 포인터(2))  (0) 2023.02.03
C 공부 (4: 포인터(1))  (0) 2023.01.29
C 공부 (3: 배열)  (1) 2023.01.28
C 공부 (1: ~ Casting)  (0) 2023.01.26