내장형 하드웨어/C언어

for 문 - 초기식, 조건식, 증감식, volatile, 최적화

동화다아아 2011. 4. 11. 13:25


- for(초기식; 조건식; 증감식) 명령문

→ 초기식: 처음 한번만 수행되는 식(식을 여러개 쓸 수도 있다. i=1,j=0), 식의 생략도 가능

→ 조건식(while문과 동일)

→ 명령문: 끝에 매번 수행(초기식과 마찬가지로 식을 여러개 쓸 수 있다.), 식의 생략 가능


초기식, 조건식, 증감식은 괄호로 묶고, 그 사이에 세미콜론을 찍는다. 초기식에는 제어변수의 초기값을 설정한다. 조건식은 논리식으로 반복을 계속할 것인지 중단할 것인지 여부를 결정한다. 증감식에는 제어변수의 값을 증가 도는 감소시킨다.


#include<stdio.h>

int main()

{

        int i;

        for(i=1,j=100;i<=5;++i,j=j+100) /* ① 조건식으로, 매번 반복할 때마다 논리식을 계산하여 제어변수 i의 값이 5보다 작거나 같으면(참) 명령문을 수행하고 거짓이면 반복을 끝내고 다음의 명령문을 실행한다. ② 초기식과 조건식에는 식을 여러개 쓰거나 생략할 수 있지만 조건식에는 하나의 식만 들어갈 수 있다.*/

        {

                printf("%d\t",i); // 한줄이므로 중괄호를 생략할 수 있지만 중괄호를 사용하는 쪽이 한눈에 보기에 훨씬 좋다.

        }

        putchar('\n'); // for문이 끝나고 한번 수행

        printf("%d\t",j); // j의 값이 출력된다. → 600

        return 0;

}

⇒ for문의 경우 (i=1,j=100;i<=5;++i,j=j+100)는

        for(i=1,j=100;

           i<=5;

           j=j+100) 과 같다.(하지만 이렇게 쓰는 것은 역시 한눈에 보기에 좋지 않으므로 사용하지는 않는다.)


⇒ 위의 for문을 while문으로 바꾸어 보면 (①번만)

        i=1; // 초기식

        while(i<=5) // 조건식

        {

                printf("%d\t",i);

                ++i; // 증감식

        }

  으로 되며, for문과 같은 동작을 수행한다.

⇒ 위의 for문을 (①번만)

        i=1; // 초기식

        for(;i<=5;) // 조건식

        {

                printf("%d\t",i);

                ++i; // 증감식

        }

  로 써도 역시 동일하다.


for문 흐름도(flow chart)

 

① 초기식 - 처음 한번만 실행된다.

② 조건식 ③증감식 ④ 출력 → ②, ③, ④가 조건내에서 반복된다.


⇒ for(i=1;i<=5000;++i); → for문 뒤에 바로 ;(세미콜론)을 붙이면 50000까지 증가하는 과정만을 반복한다.

 → 그러나 요즘의 컴파일러는 최적화를 시켜 일일이 계산하지 않고 50000을 바로 출력해 낸다.

 → 최적화는 컴파일러에 따라 CPU에 따라 다른 결과를 내는 경우가 얼마든지 있다.(컴파일러는 gcc 등의 무료 프로그램 보다는 유료 컴파일러 등이 더 낫다. - 하지만 gcc의 경우 세상에서 가장 방대한 컴파일러이다.)

⇒ 최적화: 시간제한을 줄이는 것.

 → CPU와 Memory, Bus 중 CPU 내부가 가장 빠르다. 그래서 CPU에서 버스를 거쳐 메모리를 왔다 갔다 하며 반복하는 계산은 CPU 내에서 하는 계산보다 느리며, 그렇기에 CPU안에는 캐시가 있어 그 안에 값을 두어 계산을 하며 최적화를 한다.


⇒ volatile → 최적화 하지 않는다.(캐시에 집어넣지 않는다.)

 → volatile int i; // 변수 i를 최적화 하지 않는다.(→ 캐시에 집어넣지 않고 CPU가 버스를 통해 메모리를 이동하며 계산한다. 임베디드에서 주로 쓰인다.)