'c'에 해당되는 글 7건

Programming/C C++
1. 산술연산자

 연산자  역활
 +  더하기
 -  빼기
 *  곱하기
 /  나누기
 %  나머지

#include <stdio.h>

main()
{
  int i;
  int j;
 
  i = 3;
  j = 2;
 
  printf("%d\n", i + j);
  printf("%d\n", i - j);
  printf("%d\n", i * j);
  printf("%d\n", i / j);
  printf("%d\n", i % j);
}



2. 관계연산자

 연산자  역활
 <  작다.
 >  크다.
 ==  같다.
 <=  작거나 같다.
 >=  크거나 같다.
 !=  같지않다.

#include <stdio.h>

main()
{
  int i;
  int j;
 
  i = 3;
  j = 2;
 
  if (i < j)
    printf("i가 j보다 작다.\n");
  
  if (i > j)
    printf("i가 j보다 크다.\n");
   
  if (i == j)
    printf("i와 j가 같다.\n");
   
  if (i != j)
    printf("i와 j가 같지않다.\n");
}



3. 관계연산자의 또다른 정의 방법

관계연산자를 통해 다음과 같은 구문이 작성하였습니다.

#include <stdio.h>

main()
{
  int i = 2;
  int j = 1;
  int t;
 
  if (i < j)
    t = i + j;
  else
    t = i - j;
   
  printf("결과 : %d\n", t);
}


위 program은 i가 j보다 작으면 i와 j를 더하여 t에 저장하고 i가 j보다 작지 않으면 i에서 j를 뺀 후 그 결과를 t에 저장하도록 하고 있습니다. 만일 위와 같은 조건식이 복잡하다고 생각되면 다음과 같이 작성하는 것도 가능합니다.

#include <stdio.h>

main()
{
  int i = 2;
  int j = 1;
  int t;
 
  t = (i < j) ? i + j : i - j;
   
  printf("결과 : %d\n", t);
}


'조건 ? 참일경우의 처리 : 거짓일 경우의 처리;' 의 형식으로 작성하면 위와 같은 조건식을 조금이나마 더 간단하게 표현할 수 있게 됩니다.

4. 논리연산자

 연산자  역활
 !  부정
 &&  그리고(and)
 ||  또는(or)

#include <stdio.h>

main()
{
  int i = 10;
  int j = 20;
 
  int a = 15;
  int b = 20;
 
  if ((i < j) && (a < b))
    printf("i가 j보다 작고 a가 b보다 작다.\n");
   
  if ((i < j) || (a > b))
    printf("i가 j보다 작거나 a가 b보다 크다.\n");
   
  if (!(i == a))
    printf("i가 a와 같지 않다.(i != a)와 같다.\n");
}



5. 대입연산자

 연산자  역활
 =  우변값을 좌변에 대입
 +=  좌변값과 우변값을 더한 후 좌변에 대입
 -=  좌변값에 우변값을 뺀 후 좌변에 대입
 *=  좌변값과 우변값을 곱한 후 좌변에 대입
 /=  좌변값과 우변값을 나눈 후 좌변에 대입
 %=  좌변값과 우변값을 나누고 그 나머지를 자변에 대입
 >>=  좌변값을 우변값만큼 오른쪽 shift연산 후 좌변에 대입
 <<=  좌변값을 우변값만큼 왼족 shift연산 후 좌변에 대입
 &=  좌변값과 우변값을 and연산 후 좌변에 대입
 |=  좌변값과 우변값을 or연산 후 좌변에 대입
 ^=  좌변값과 우변값을 xor연산 후 좌변에 대입

#include <stdio.h>

main()
{
  int i = 10;
  int j = 20;
 
  i = j;
  printf("j값을 i변수에 대입 %d\n", i);
 
  i += j;
  printf("i와 j를 더하고 그 결과를 i에 대입 %d\n", i);
 
  i -= j;
  printf("i에 j값을 감산한 후 그 결과를 i에 대입 %d\n", i);
 
  i *= j;
  printf("i와 j를 곱하고 그 결과를 i에 대입 %d\n", i);
 
  i /= j;
  printf("i와 j를 나누고 그 결과를 i에 대입(정수결과값 반환) %d\n", i);
 
  i = 10;
  j = 3;
 
  i %= j;
  printf("i와 j에 대한 나머지 결과를 i에 대입 %d\n", i);
 
  i = 5;
  j = 1;
 
  i >>= j;
  printf("i값을 j만큼 오른쪽 shift한 후 i에 대입 %d\n", i);
 
  i <<= j;
  printf("i값을 j만큼 왼쪽 shift한 후 i에 대입 %d\n", i);
 
  i = 3;
  j = 2;
 
  i &= j;
  printf("i값과 j값을 and연산(bit 기준) %d\n", i);
 
  i = 2;
  j = 3;
 
  i |= j;
  printf("i값과 j값을 or연산(bit 기준) %d\n", i);
 
  i = 2;
  j = 4;
 
  i ^= j;
  printf("i값과 j값을 xor연산(bit 기준) %d\n", i);
}



6. Shift연산

인간의 입장에서 가장 많이 쓰이는 숫자는 10진수입니다. 그에 반해 Computer는 0과 1만으로 이루어진 2진수를 씁니다. 0과 1만으로 Data를 처리하기가 가장 간단하기 때문에 그 만큼 단순화할 수 있기 때문입니다. 2진수를 10진수로 이해하기 위한 방법중의 하나로 2진수 각 자리를 2의 승수로 계산하는 방법이 있습니다. 예를 들어

10

이라는 2진수가 있으면 각 자리를 오른쪽 부터 20, 21순으로 계산하여 2 * 0, 2 * 1 을 하게되면 2 * 1에만 1이 있으므로 10진수로 2가 되는 것입니다.

Shift연산이라는 것은 이 2진수로 나열된 숫자를 밀어버리거나 당겨놓는 것을 의미하는 것으로 C언어를 통해

5 >>= 1

이라고 하면 '5를 2진수화 한 기준에서 1만큼 오른쪽으로 민다.'라는 의미가 됩니다. 따라서 5를 2진수로 분해하면

101

이 되고 이 상태에서 오른쪽으로 1만큼 밀면 결과는

10

이 됩니다.

마지막으로 이 10이라는 2진수를 10진수로 바꾸면 다음과 같은 결과가 생기게 됩니다.(왼쪽 Shift연산을 하면 0이 채워지게 됩니다.)

2

Shift연산자는 필요하다면 몇개든 사용할 수 있습니다.

5 >> 4 << 3 >> 2

7. and, or, xor연산

and연산은 연산하고자 하는 피연산자의 bit가 1일때만 1이 되는 연산입니다. 참고로 and와 or, xor연산도 Shift연산처럼 2진수를 기준으로 연산합니다.

10진수 3을 2진수로 -> 11
10진수 2를 2진수로 -> 10

11과 10을 and연산하면 1이 있는 것만 1이되므로 결과는 10(10진수 2)이 됩니다.

and는 피연산자가 모두 1이여야만 결과가 1이지만 or연산자는 둘줄 하나만 1이여도 결과가 1이 됩니다.

10진수 2를 2진수로 -> 10
10진수 3을 2진수로 -> 11

10과 11을 or연산하면 둘중 하나만 1이 있어도 1이되므로 결과는 11(10진수 3)이 됩니다.

and와 or는 피연산값이 1인가 0인가에 따라 결과가 달라지지만 xor는 피연산자값이 같은가 틀린가에 따라 결과가 달라집니다.

10진수 2를 2진수로 ->  10
10진수 4를 2진수로 -> 100

10과 100을 xor연산하면 처음 두자리 까지는 상호 값이 다르므로 1이고(비어있는 부분은 자동으로 0이 됩니다.) 마지막 한자리는 둘다 값이 0이므로 연산값은 0이 됩니다. 따라서 결과는 110 (10진수 6)이 됩니다.

참고 :
산술연산자와 Shift연산자, and/or/xor연산자는 모두 뒤에 =기호가 붙어있어서 대입관련 연산자가 되지만 =기호만 빼면 각각의 역활을 별도로 수행하는 연산기호가 됩니다.(and, or, xor연산자는 모두합쳐 bit연산자라고도 합니다.)

8. sizeof 연산자

sizeof는 특정 Data형의 크기값을 반환하는 연산자중의 하나입니다.

#include <stdio.h>

main()
{
  int i;
 
  printf("int형 크기 : %d\n", sizeof(i));
}



9. cast 연산자

특정 Data형을 다른 Data형으로 변환하기 위한 연산자입니다.

#include <stdio.h>

main()
{
  int i = 10;
  
  printf("%f\n", (float)i);
}


(float)i 를 통하여 int형 변수 i를 float형으로 변환하여 출력합니다.


참고 :
Data형이 작은 것과 Data형이 큰것끼리 큰 Data형을 기준으로 연산하게 되면 자동 형변환되어 연산됩니다.

#include <stdio.h>

main()
{
  char c = 10;
  int i = 1000;
 
  printf("%d\n", c + i);
}



10. 증/가감 연산자

 연산자  역활
 ++  1더한다.
 --  1뺀다.

증/가감 연산자는 피연산자의 값을 1증가하거나 1감소시키는 역활을 합니다.

#include <stdio.h>

main()
{
  int i = 1;
 
  ++i;
 
  printf("%d\n", i);
}



하지만 ++나 --연산자가 다른 연산자와 함께 연산되는 경우 증/가감연산자가 앞에 있으면 선증가/선감소 되고 뒤에 있으면 후증가/후감소되어 약간씩 다른 결과를 나타낼 수도 있습니다.

예를 들어

int i = 100;
int j;
j = ++i - 50;

라고 하면 ++연산자가 앞에 있으므로 먼저 i값을 1증가 시킨 후 - 50을 계산하게 됩니다. 반면

int i = 100;
int j;
j = i++ - 50;

위와 같이 ++가 피연산자의 뒤에 위치하게 되면 먼저 - 50을 계산한 후에 i값을 1증가시키게 됩니다.

#include <stdio.h>

main()
{
  int i = 100;
  int j;
 
  j = ++i - 50;
  printf("%d\n", i);
  printf("%d\n", j);
 
  i = 100;
 
  j = i++ - 50;
 
  printf("%d\n", i);
  printf("%d\n", j);
}



11. bit 연산자

 연산자  역활
 &  and 연산
 |  or 연산
 ^  xor 연산
 ~  반전

bit연산자는 피연산자의 bit부호를 가지고 연산을 수행하는 연산자 입니다.

#include <stdio.h>

main()
{
 char i = 5;
 char j = 4;
 i = i & j;
 printf("%d\n", i);
}


i의 값과 j의 값을 &(and) 연산합니다.

먼저 &(and)연산은 두 bit가 1이되야만 결과가 1이 되는 연산입니다. i의 5와 j의 4라는 값을 bit로 분해해 보면 다음과 같이 되며(Char 형은 8bit크기(128)의 Data형입니다.)

i 값 5 => 00000101
j 값 4 => 00000100

bit값 중에서 같은 위치에 둘다 1인것은 뒤에서 세번째 bit밖에 없으므로 and연산의 결과는

00000100 => 정수값 4

가 되는 것입니다.


#include <stdio.h>

main()
{
 char i = 5;
 char j = 4;
 i = i | j;
 printf("%d\n", i);
}


i와 j값을 |(or) 연산합니다.

|(or)연산은 두개의 피연산자중 하나만 1이여도 결과가 1이되는 연산입니다.

5 => 00000101
4 => 00000100
-------------
결과 00000101 (5)


#include <stdio.h>

main()
{
 char i = 5;
 char j = 4;
 i = i ^ j;
 printf("%d\n", i);
}


i와 j값을 ^(xor)연산합니다.

^(xor)연산은 두 피연산자가 0이든 1이든 서로 다른 값을 가져야만 결과가 1이되는 연산입니다.

5 => 00000101
4 => 00000100
-------------
결과 00000001 (1)


#include <stdio.h>

main()
{
 char i = 128;
 
 i = ~i;
 printf("%d\n", i);
}


i값의 모든 bit를 반전시킵니다.

~연산은 피연산자의 bit를 모두 반전시키는 연산자입니다.

128 => 10000000
---------------
반전    01111111 (127)

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

[C, C++] Object(obj)와 Link  (0) 2011.02.10
[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
0 0
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
Programming/C C++
C Program이 Compile시에는 실제 Source의 내용을 바로 Compile하는 것이 아니라 일단 개발자가 작성한 Source를 분석하여 필요시 일부 Source를 수정하는 작업을 진행 하게됩니다. 이처럼 Compile하기전에 미리 어떠한 작업이 이루어지는 것을 흔히 '전처리'라고 부릅니다.(전처리 과정은 대게 Source File과 include File을 결합한 직후 발생합니다.)

참고:
C언어는 일반적으로 ; 문자까지를 하나의 행으로 보지만 예외적으로 #로 시작하는 내용은 그 행의 끝까지를 하나의 행으로 간주합니다.

1. #include

Source Code의 처음부분에 #include <header file> 형식으로 선언되어 지정된 Header File을 Program의 Source Code에 포함되도록 합니다. 그러면 전처리를 통해 실제 Header File의 내용을 추가하는 작업이 이루어 지게 되는것입니다.

#include <stdio.h>

main()
{
  printf("hello\n");
}

▶Source 작성

/***
*stdio.h - definitions/declarations for standard I/O routines
*
*       Copyright (c) Microsoft Corporation. All rights reserved.
*
*Purpose:
*       This file defines the structures, values, macros, and functions
*       used by the level 2 I/O ("standard I/O") routines.
*       [ANSI/System V]
*
*       [Public]
*
****/

#if     _MSC_VER > 1000
#pragma once
#endif
#ifndef _INC_STDIO
#define _INC_STDIO
#if     !defined(_WIN32)
#error ERROR: Only Win32 target supported!
#endif
--이하생략... 위 부분이 stdio.h의 실제 내용

main()
{
  printf("hello\n");
}


전처리에 의해 stdio.h Header File이 Program에 추가됩니다.

C에는 많은 Library의 Header File이 존재하지만 이 Header File을 개발자가 직접 작성여여 사용할 수도 있습니다. 이럴때는 #include를 통해 <와 >대신 "문자를 통해 사용자 Header File을 추가하면 됩니다.

#include "header file"

이때 해당 Header File은 현재 작업중인 경로에서 찾게 되는데 지정된 Hearder File이 없는 경우 다시 원래의 표준경로를 찾아가 Header File을 찾게 됩니다. 또한 사용자가 직접 작성한 Hearder File이라 하더라도 현재작업중인 경로가 아닌 표준경로에 저장된 경우 ""대신 <>로 Header File을 지정하여도 정상적으로 동작하게 됩니다.

myprint(char s[])
{
  printf("%s <- 문자열 출력\n", s);
}
▶'myheader.h' 라는 이름으로 Header File작성

#include <stdio.h>
#include "myheader.h"

main()
{
  myprint("hello");
}


myheader.h Header File을 현재 위치에 저장한 후 "로 myheader.h File을 포함합니다.


2. #define

전처리과정에서 #define로 정의된 문자열을 Source상에서 치환되도록 Macro를 정의합니다.

#include <stdio.h>
#define Count 10

main()
{
  int i;
 
  for (i=0;i<=Count;i++)
  {
    printf("i의 값 %d\n", i);
  }
}

▶ #define을 통해 Count라는 문자열을 정수 10으로 인식합니다.

#include <stdio.h>

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


전처리를 통해 Source Code에 있는 Count라는 문자열을 10으로 치환한후 Compile합니다.


또한 #define를 사용하면 인수를 가져야 하는 함수자체를 정의할 수도 있어서 특정 함수를 간단히 활용할 수 있습니다.

#include <stdio.h>
#define prnt(s) printf("%s\n", s)

main()
{
  prnt("문자열 출력");
}


printf("%s\n", s)함수를 printf(s)로 Macro정의합니다. 이때 s는 화면에 출력할 문자열의 인수입니다.


Macro는 사용자가 정의할 수도 있지만 편의상 미리 마련된 Macro도 있습니다.

다음은 해당 Macro종류및 사용 예제입니다.

 macro  설명
 __DATE__  현재 날짜를 나타냅니다.(Computer설정 기준)
 __LINE__  _LINE_가 위치한 행의 번호를 나타냅니다.
 __TIME__  현재 시간을 나타냅니다.(Computer설정 기준)
 __FILE__  _FILE_이 있는 Source File의 이름을 나타냅니다.
 __STDC__  현재 C Program이 완벽히 ANSI C 표준만을 따를때 이 Macro가 정의됩니다.(값1)
만일 표준을 따르지 않고 현재 사용중인 개별 Compiler의 확장기능을 이용했을 경우 이 Macro는 정의되지 않습니다.

#include <stdio.h>

main()
{
  printf("현재 날짜는 %s 이며 시간은 %s 입니다.\n", __DATE__, __TIME__);
  printf("이 program file의 이름은 %s 입니다.\n", __FILE__);
  printf("이 행의 번호는 %d 입니다.\n", __LINE__);
  printf("ANSI C 표준입니까?%d\n", __STDC__);
}



Compile할때 /Za 를 지정하였습니다. ANSI C에 맞춰야 __STDC__ Macro를 확인할 수 있기 때문입니다. Microsoft C/C++ Compiler는 Compil시 /Za 가 있을때 해당 Source를 ANSI C에 맞게 Compile합니다.

3. #undef

#define를 통해서는 Macro를 정의하는 반면 #undef는 정의된 Macro를 해제하는 역활을 합니다.(#undef로 해제된 Macro는 #define로 다시 재정의 될 수 있습니다.)

#include <stdio.h>
#define line 500

main()
{
  int i;
  i = line;
  printf("현재 macro : %d\n", i);
 
  #undef line
  #define line 1000
 
  i = line;
 
  printf("재정의된 macro : %d\n", i);
}


main함수에서 #undef를 통해 미리 정의된 Macro를 해제하고 다시 #define로 Macro를 정의합니다.

주의:
#으로 시작하는 전처리는 끝에 ;문자를 붙이지 않습니다.


4. #if ~ #elif / #else ~ #endif

특정 조건을 만족할때만 개발자가 직접 작성한 Source Code의 일부분을 Compil하거나 또는 하지 않을 수 있습니다.(이것을 조건부 Compile이라고 합니다.)

#include <stdio.h>
#define error 0

main()
{
  #if (error == 0)
    printf("error는 0\n");
  #elif (error == 1)
    printf("error는 1\n");
  #else
    printf("이도저도 아님...\n");
  #endif
}


전처리에 의해 error가 정의된 값을 판단하여 해당 값에 따라 Compil하도록 합니다. 이것은 본래 if문과 작동은 비슷한 형태인데 error가 0이면 #if이하의 내용만, error가 1이면 #elif이하의 내용만 Compile하며 error가 0도 1도 아니면 #else이하 Code만을 Compile하도록 합니다.

실제 작동은 보통 if문을 쓸때와 별 다를바가 없지만 여기서는 Compile되는 Program에 어떤 Code의 내용만이 들어가는가가 중요합니다. 만일 #if를 쓰지않고 일반 if문을 쓰게되면 error가 무엇인지에 상관없이 모든 Code가 Compile될 것입니다.

#if는 전처리를 행한다는 특징때문에 Program이 실행되고 있다는 가정하에서는 아무런 소용이 없으며 일반적으로 Program Debug시에만 사용하곤 합니다.

5. #ifdef / #ifndef

Macro는 #define을 통해서 정의합니다. 이때 해당 Macro가 정의되었는가 또는 정의되지않았는가에 따라 별도의 처리를 하고자 한다면 #ifdef / #ifndef를 사용하도록 합니다.

#include <stdio.h>
#define error 10

main()
{
 #ifdef error
  printf("error가 10으로 정의됨\n");
 #endif
 #undef error
 #ifndef error
  printf("error가 정의되지 않음\n");
 #endif
}


#ifdef에 의해 error가 정의되어 있다고 판단되면 printf("error가 10으로 정의됨\n"); 부분을 Compile하게 되고 #undef에 의해 해당 Macro가 취소됩니다. 또한 #ifndef로 Macro미정의가 판단되어 printf("error가 정의되지 않음\n"); 부분이 Compile되는 것입니다.


6. #if ~ defined / !defined

앞서 살펴본 #ifdef는 단일 Macro만을 판단하지만 #if ~ defined(!defined)는 조건지시시자 개념으로 #ifdef를 보다 확장한 것이며 defined는 참일경우 !defined는 거짓일 경우 처리됩니다.

#include <stdio.h>
#define a 1
#define b 2

main()
{
  #if defined(a)
    printf("a 정의됨!\n");
  #endif
 
  #if !defined(c)
    printf("c 정의안됨!\n");
  #endif
 
  #if defined(b)
    printf("b 정의됨!\n");
  #endif
 
  #if defined(a) && defined(b)
    printf("a와 b둘다 정의됨.\n");
  #endif
}


#if ~ defined/!defined 는 위와같이 if조건연산자인 &&이나 ||등을 지정할 수 있습니다.


7. #error

조건에 따라 compile시에 Error Message를 표시하도록 합니다.

#include <stdio.h>
#define a 1

#if a == 1
#error a error...
#endif

main()
{
  printf("aaa\n");
}


#if ~ #endif 에 따라 a가 1이면 #error에 정의된 Message를 출력하도록 하였습니다.


8. ##

##은 이 ##을 기준으로 양쪽의 내용을 결합니다.

#include <stdio.h>
#include <string.h>

#define prnt(a, b) a ## b

main()
{
  printf("%s\n", prnt("hello", "world"));
}


prnt에 두개의 문자열을 , 로 분리하여 전달하지만 #define에서 a ## b문으로 "helloworld"내용으로 결합됩니다.

1 0
Programming/C C++
아래 함수사용하려면 string.h 선언이 필요합니다.

 함수  사용  설명
 strcmp()  strcmp(*s1, *s2)  s1이 s2보다 크면 1을 같으면 0을 인수2가 인수1보다 크면 -1값을 반환합니다.
 strncmp()  strncmp(*s1, *s2, i)  s1과 s2의 문자열을 i수 만큼만 비교합니다.(결과는 strcmp와 같습니다.)
 stricmp()  stricmp(*s1, s2)  s1과 s2의 문자열을 대소문자 구분없이 비교합니다.(결과는 strcmp와 같습니다.)
 strnicmp()  strnicmp(*s1, s2, i)  s1과 s2의 문자열을 i수 만큼만 대소문자 구분없이 비교합니다.(결과는 strcmp와 같습니다.)

각 함수의 s1, s2는 문자열 인수를, i를 정수형 인수를 의미합니다. 또한 각 문자열 비교시 비교값은 문자열을 이루는 각 Ascii값을 토대로 합니다.(이때 strcmp와 strncmp는 대소문자를 구분해서 각각의 Ascii값을 가져오지만 stricmp와 strnicmp는 대소문자를 구분하지 않습니다.)

#include <stdio.h>
#include <string.h>

main()
{
  char ss[7] = "abcdef";
  char es[7] = "ABCDEF";
 
  printf("%d\n", strcmp(ss, es));
}


strcmp함수를 통해 두 문자열값을 비교합니다.

0 0
Programming/C C++
printf()함수를 통해 어떤 Data를 화면에 표시하는 경우 확장 문자열을 사용하면 다양한 처리를 할 수 있습니다. 확장문자열은 \로 시작하는 문자열로써 이때 해당 문자열은 실제 화면에 표시되지 않고 지정된 기능을 수행하게 됩니다.(그래서 확장문자열이라고 부릅니다.)

 확장 문자열  기능
 \a  경고음 발생
 \b  back space 효과
 \f  form feed(인쇄넘김)
 \n  한줄 개행
 \r  carriage return
 \t  tab 효과
 \v  tab 효과(세로)
 \'  문자
 \"  문자열
 \0  8진수
 \x  16진수
 \\  \문자 표시

#include <stdio.h>

main()
{
  printf("abc\bef");
  printf("abc\nef");
  printf("abc\tef");
}



쌍따옴표(")는 문자열을 따옴표(')는 문자를 나타내는 용도로 사용되는데 printf에서 단독으로 쓰면 표시가 불가능하지만 \를 써서 확장문자열로 표시하게 되면 화면에 표시하는 것이 가능해 집니다.

#include <stdio.h>

main()
{
  printf("문자열 인용 \"가나다라마바사\" 이렇게...\n");
  printf("문자 인용 \'가\', \'나\', \'다\' 하하하\n");
}



이 외에도 표시가 안되는 다른 특수문자들도 \를 사용하면 표시할 수 있다는 점을 기억해 두시기 바랍니다.

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

[C, C++] 함수처리  (0) 2010.04.05
[C, C++] Class구현시 Static활용  (0) 2010.04.02
[C, C++] 확장 문자열  (0) 2010.03.30
[C, C++] 표준 Library 함수 - 문자 변환 함수  (0) 2010.03.29
[C, C++] Object간의 연산과 Operator  (0) 2010.02.24
[C, C++] Microsoft C, C++ Compiler  (0) 2010.01.22
c, \", \', \0, \a, \b, \f, \n, \r, \t, \v, \x, \\
0 0
Programming/C C++
아래 해당 함수를 사용하려면 ctype.h Header File이 선언되어야 합니다.

 함수  사용  설명
 toupper()  toupper(c)  전달되온 인수가 소문자이면 대문자로 변환합니다.
 tolower()  tolower(c)  전달되온 인수가 대문자이면 소문자로 변환합니다.

각 함수의 c는 문자형 인수를 의미합니다.

#include <stdio.h>

main()
{
  char s[6] = "korea";
  int cnt;
 
  for (cnt=0; cnt<=5; cnt++)
    printf("%c", toupper(s[cnt]));
}


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

[C, C++] Class구현시 Static활용  (0) 2010.04.02
[C, C++] 확장 문자열  (0) 2010.03.30
[C, C++] 표준 Library 함수 - 문자 변환 함수  (0) 2010.03.29
[C, C++] Object간의 연산과 Operator  (0) 2010.02.24
[C, C++] Microsoft C, C++ Compiler  (0) 2010.01.22
[C, C++] Class 상속  (0) 2010.01.13
0 0
Programming/C C++
MS사의 Visual Studio 개발도구에는 C와 C++ Compile인 cl.exe Compiler가 같이 포함되어 있습니다.

해당 Compiler의 위치는 C:\Program Files\Microsoft Visual Studio 9.0\VC\bin (VS 2008기준이며 각 VS Version마다 약간씩 차이가 있을 수 있습니다.)에 위치해 있습니다.


cl.exe Compiler는 원한다면 다른 위치에서 사용해도 상관없으나 cl.exe를 이용해 C/C++ Source를 Compil하려면 환경변수라를 것을 먼저 설정해야 합니다.

환경변수 설정은 cl.exe Compiler와 함께 같이 포함되어 있는 vcvars32.bat Batch을 통해 간단히 설정할 수 있으며 이 File을 실행시켜 주기만 하면 됩니다.


특정 작업 Folder를 생성하고 그 안에서 작업하기를 원한다면 cl.exe와 vcvars32.bat File이 같이 존재해야 합니다.

다음은 간단한 Program을 작성하고 작성한 Program을 cl.exe Compiler를 이용해 Compil한 후 Program을 실행시키는 예제입니다.


1. cl.exe로 Compil시 Source File및 Object File Compil

(1) cl aaa.c
aaa.c Source File을 Compil하여 aaa.obj Object File을 만들고 생성된 obj를 Link하여 실행 File을 생성합니다.

(2) cl aaa.obj
aaa.obj Object File을 Link하여 Compile하고 실행 File을 생성합니다.

(3) cl aaa.c bbb.c
aaa.c와 bbb.c Source File을 Compil하여 각각 Object File을 만든 후 생성된 Object와 표준 Library를 Link하여 aaa.exe File을 생성합니다.

(4) cl aaa.c bbb.obj
aaa.c Source File을 Compil하여 aaa.obj를 생성한 후 생성된 obj를 bbb.obj와 Link하여 aaa.exe File을 생성합니다.

(5) cl /c aaa.c
/c Switch는 obj만 생성할 뿐 실행 File은 생성하지 않습니다.

2. cl compiler 경고 Message지정

Compil도중의 경고 Message는 compil하고 실행 File을 생성하는데는 문제는 없으나 Program이 정확히 기술되지 않는등의 문제점을 보고하는 역활을 합니다. 예들 들어

#include <stdio.h>
main()
{
  int i;
 
  printf("hello\n");
}

int 형 변수 i를 선언했지만 사용하지는 않은 Program이 있습니다. 이 Program에 대한 Compil은 문제가 없지만


경고 Message의 Level을 높여 다시 Compile하면


변수 i에 대한 경고 Message를 내뱉게 됩니다.

경고 Message의 Level지정은 /W0 부터 /W4 까지 이며 숫자가 높을 수록 좀더 철저히 Source를 검사하여 Message를 발생시킵니다.(기본값은 /W1)
0 0
1
블로그 이미지

클리엘