Programming/C C++
1. if

if는 지정한 조건에 따라 해당 조건에 맞는 지점으로 분기하여 처리되는 제어문 입니다.

#include <stdio.h>

main()
{
  int i = 1;
 
  if (i==1)
   printf("i값은 1입니다.\n");
}


i가 1이면 Message를 출력합니다. i가 1이라는 조건은 if에서 괄호 안에 지정된 것입니다.


#include <stdio.h>

main()
{
  int i = 1;
 
  if (i==1){
    printf("i값은 1입니다.\n");
    printf("i값 확인 %d\n", i);
  }
}


또는

#include <stdio.h>

main()
{
  int i = 1;
 
  if (i==1)
 {
    printf("i값은 1입니다.\n");
    printf("i값 확인 %d\n", i);
  }
}


C언어의 제어문은 기본적으로 단 하나의 문장만을 제어범위에 포함합니다. 이때 제어문에 의해 처리되는 범위가 여러줄에 해당한다면 위와 같이 {와 }로 제어범위를 묶어줄 수 있습니다.


#include <stdio.h>

main()
{
  int i = 2;
 
  if (i==1){
    printf("i값은 1입니다.\n");
  }
  else
    printf("i값은 1이 아닙니다.\n");
}


if문에 지정한 조건이 부정일 경우 다른 처리가 필요할때는 else를 사용합니다.


#include <stdio.h>

main()
{
  int i = 2;
 
  if (i==1){
    printf("i값은 1입니다.\n");
  }
  else if(i==2)
    printf("i값은 2입니다.\n");
  else
    printf("i값은 1도 2도 아닙니다.\n");
}


else if를 통해 실행되는 조건을 별도로 지정할 수도 있습니다.


2. switch

조건에 따라 분기하여 처리하는 제어문입니다. if문은 조건에 다양한 형식을 지정할 수 있지만 switch에서 조건의 판단은 정수형태만 가능합니다.

#include <stdio.h>

main()
{
  int i=2;
 
  switch(i){
    case 1:
      printf("i값은 1입니다.\n");
      break;
    case 2:
      printf("i값은 2입니다.\n");
      break;
  }
}


switch에 정수형 값을 넣어 그 값이 어떤 값이냐에 따라 case문으로 분기하여 해당 내용을 처리하게 됩니다. 조건에는 정수형만 가능하므로 case의 분기값에 <, >를 사용하여 지정할 수 없으며 문자열또한 사용이 불가능합니다.

case는 분기값 다음에 반드시 : 문자가 있어야 하며 그 하위에 처리내용을 지정하는데 이때 switch문은 그 자체가 여러행으로 구성되므로 {와 }가 반드시 필요하지만 case 하위에는 처리해야할 문장이 여러행이라 하더라도 {와 }를 사용하지 않습니다.


#include <stdio.h>

main()
{
  int i=2;
 
  switch(i){
    case 1:
      printf("i값은 1입니다.\n");
    case 2:
      printf("i값은 2입니다.\n");
    case 3:
      printf("i값은 3입니다.\n");
 }
}


case에서 Break문을 쓰지않으면 해당 값에 맞는 case문으로 분기한 이후 그 다음 case문까지 모두 실행하게 됩니다. 이는 switch에서 분기 후 해당 분기점의 처리문만 실행한다는 개념이 아니라 분기한 지점부터 순차적으로 실행한다는 개념이 적용되기 때문입니다.

따라서 값에 맞는 case문의 내용만 처리하고자 한다면 case처리문의 마지막에 반드시 break;을 추가해야 합니다.


break문을 쓰지않아 분기점이후의 모든 case문까지 실행되었습니다.

#include <stdio.h>

main()
{
  int i=4;
 
  switch(i){
    case 1:
      printf("i값은 1입니다.\n");
      break;
    case 2:
      printf("i값은 2입니다.\n");
      break;
    case 3:
      printf("i값은 3입니다.\n");
      break;
    default:
      printf("이도저도 아니네...\n");
}


default는 조건이 case문에 해당하는 분기값에 어떤것도 해당되지 않는 경우 실행되는 부분입니다.


#include <stdio.h>

main()
{
  int i=3;
 
  switch(i){
    case 1:
      printf("i값은 1입니다.\n");
      break;
    case 2:
    case 3:
    case 4:
      printf("i값은 2또는 3또는 4입니다.\n");
      break;
    case 5:
      printf("i값은 5입니다.\n");
      break;
    default:
      printf("이도저도 아니네...\n");
   }
}

case문을 중첩하여 분기값을 여러개 지정할 수도 있습니다.


3. for

for는 지정한 횟수만큼 반복처리를 수행합니다.

#include <stdio.h>

main()
{
  int i = 0;
 
  for (i=1;i<6;i++)
    printf("현재 i값은 %d\n", i);
}


for에서 반복되는 조건은 (초기값;반복조건;처리값) 형태로 지정합니다. 예제에서의 조건은 처음 i값을 1로 하고 i가 6이하이면(i가 6이하일때까지가 아닙니다.!) i를 1씩 증가하면서 반복하도록 하고 있습니다.


#include <stdio.h>

main()
{
  int i = 0;
 
  for (i=1;i<6;i++){
    printf("현재 i값은 %d\n", i);
    printf("i값을 1씩 증가합니다.\n");
 }
}


for문도 제어하고자 하는 문장이 여러행이면 {와 }로 제어범위를 묶어줄 수 있습니다.


#include <stdio.h>

main()
{
  int i = 0;
 
  for (i=1;i<6;i++){
    printf("현재 i값은 %d\n", i);
  }
 
  printf("-----------------------\n");
 
  for (i=5;i>0;i--){
    printf("현재 i값은 %d\n", i);
  }
}


for의 조건식에서 처리값은 증가뿐 아니라 감소도 지정할 수 있습니다.


#include <stdio.h>

main()
{
  for (;;){
  }
}


아무런 조건도 지정하지 않으면 무한대로 반복합니다.

4. while

while은 주어진 조건만 만족하면 계속적으로 반복하는 제어문 입니다.

#include <stdio.h>

main()
{
  int i = 0;
 
  while(i<5){
    printf("i가 5보다 작으면 반복합니다.\n");
   
    ++i;
  }
}


while은 조건이 부정이 될때까지 계속 반복합니다.(단, 동작하기전 주어진 조건이 참인가를 먼저 검사하게 되므로 조건이 처음부터 부정일경우에는 while문 자체가 단 한차례도 수행되지 않을 수 있습니다.)


#include <stdio.h>

main()
{
  while(1){
    }
}


조건을 위와같이 지정하면 while문은 무한대로 반복합니다.

5. do-while

while은 시작하기 처음부터 '참/거짓'을 판단하지만 do-while은 일단 실행한뒤 계속 반복할지에 대한 조건을 판단합니다.

#include <stdio.h>

main()
{
  int i=0;
 
  do{
    ++i;
   
    printf("i값 %d\n", i);
  }while(i<2);
}


do에 의해 처음 반복문을 실행한 후 while에서 괄호안의 조건을 확인하고 반복문을 수행할지 판단합니다.


주의:
C의 제어문과 반복문은 문장이 아니므로 끝에 ;문자를 추가하지 않지만 do-while문에서는 while끝에 반드시 ;가 있어야 합니다.

6. break

break는 반복문에서 처리를 중단하는 용도로 많이 쓰입니다.

#include <stdio.h>

main()
{
  int i=0;
 
  for(i=0;i<5;i++){
    printf("for i값 %d\n");
   
    if (i==2)
      break;
  }
 
  i = 0;
 
  while(i<5){
    printf("while i값 %d\n");
   
    i += 1;
   
    if (i==4)
      break;
  }
}


for문에서는 i가 2가되면 if 조건에 의해 break;가 실행되고 while문에서는 i가 4일때 break;가 실행되어 반복문의 실행을 중지하도록 하고 있습니다.


#include <stdio.h>

main()
{
  int i=0;
  int j=0;
 
  for(i=0;i<3;i++){
    printf("i값 %d\n", i);
   
    for(j=1;j<3;j++)
      if (j==2)
        break;
       
      printf("i값 %d과 j값 %d\n", i, j);
  }
}


만일 반복문이 중첩되어 사용되는 경우에는 break가 사용된 반복문만 중지됩니다.(모든 반복문에 영향을 주지는 않습니다.)


7. continue

break는 반복문 실행을 완전히 중단시키는 역활을 하지만 continue는 단 한번만 중단시키고 실행을 계속 진행하게 합니다.

#include <stdio.h>

main()
{
  int i=0;
 
  for(i=0;i<=10;i++){
    if (i==7)
      continue;
    
    printf("i값 %d\n", i);
  }
}


i가 7일때 continue로 인해 반복문 실행을 건너뜁니다.


8. goto

goto는 program실행(처리)흐름을 다른곳으로 jump하여 동작하도록 하는 제어문으로서 jump할 지역은 : 문자를 통해 label표시합니다.

#include <stdio.h>

main()
{
  int i=0;
 
  for(i=0;i<=10;i++){
    if (i==7)
      goto jump;
    
    printf("i값 %d\n", i);
  }
 
jump:
  printf("i는 7입니다.\n");
}


i값이 7이면 goto에 의해 Program실행이 jump: 이하 부분으로 이동합니다.


만일 Program이 단일 함수가 아닌 여러개의 함수로 구성될 경우 함수끼리 jump하려면 setjump()함수를 사용해야 합니다.

#include <stdio.h>
#include <setjmp.h>

jmp_buf jump;

func()
{
    longjmp(jump, 2);
}

main()
{
    int i;
    i = setjmp(jump);
   
    if (i == 0){
      printf("i값 : %d\n", i);
      func();
      return;
    }
    else{
      printf("i값 : %d\n", i);
    }
}


먼저 setjmp()에서는 현재 setjmp()가 선언된 위치의 정보를 jump라는 특수한 형태의 변수에 저장합니다.(여기서 사용되는 jump는 jmp_buf로 선언하며 이 정의는 setjmp.h header file안에 선언되어 있습니다.)

setjmp()가 호출되면 되돌아와야할 정보를 jump에 저장하는데 이때는 일반적으로 0값이 반환됩니다. 이때 if문에 의해 0인지를 판단하고 0이면 func()함수를 호출하는 것입니다.

func()함수안에서는 longjmp()함수가 사용되었는데 이 함수에 의해 jump에서 가리키고 있는 위치(main에서 setjmp()위치)로 jump하게 되며 이때 인수로 2라는 값을 넘겨주면서 결국 else이하 부분을 수행하게 되는 것입니다.

'Programming > C C++' 카테고리의 다른 글

[C, C++] 상수(숫자, 문자, 문자열, 열거형) 정의및 사용  (0) 2011.02.09
[C, C++] 연산자  (0) 2011.02.08
[C, C++] 제어문  (0) 2011.02.01
[C, C++] 공용체  (0) 2010.09.27
[C, C++] Volatile  (0) 2010.09.15
[C, C++] File 다루기  (0) 2010.08.13
0 0