C의 역사와 자료형에 이어 C의 다양한 구성요소들과 함수들에 대해 알아보겠습니다.


C의 명령어를 처리하는 단위는 문장입니다.

단일 문장은 한개의 명령어로 구성된 문장입니다.

(; - 세미콜론)으로 구분짓습니다.

printf("Hello,World!");

복합문장은 여러개의 명령어로 구성된 문장이며, ({} - 중괄호)로 범위 지어 표현합니다.


{
    printf("Hello,World!(1)");
    printf("Hello,World!(2)");
    printf("Hello,World!(3)");
}    

변수 (Variable)

  변수는 프로그램이 실행되는 동안 지속적으로 값을 변경하면서 사용할 수 있는 정보를 말합니다. 일반적으로 자료형과 함께 선언되며, 프로그램 결과에 따라 값이 변하는 특징을 가지고 있습니다.


상수(Constant)

  상수는 프로그램 실행 시 한 번 값이 결정되면 프로그램이 종료될 때 까지 변경할 수 없습니다. 변수처럼 자료형과 함께 선언됩니다.

  숫자형상수 : 1,2,3, ...

  문자형상수 : 'a', 'b', 'c', ... -> 'abc' 와 같은 문자열은 첫글자인 'a'로 인식합니다. ('작은따옴표')

  문자열형상수 : "Hello, World" ("큰따옴표")


연산자(Operator)

  연산자는 프로그래머가 원하는 개별적인 연산을 지정할 때 사용하는 식별자(Keyword)입니다.


정수연산 시 소수점 이하는 버립니다.

수학은 연산자 우선순위가 중요하지만 컴퓨터는 연산방향도 중요합니다.

자세한 연산자 우선순위는 MSDN 링크 를 참조하시기 바랍니다.


연산자의 계산 방향은 다음과 같습니다.


 연산자 기호

연산 유형

 계산 방향

 ( )

식 

 왼쪽 -> 오른쪽 

 -, !, ~

단항연산자 

 오른쪽 -> 왼쪽 

 casts

단항연산자 

 오른쪽 -> 왼쪽 

 *, /, %

곱셈 

 왼쪽 -> 오른쪽

 +, -

덧셈

 왼쪽 -> 오른쪽

 <, >, <=, >=

관계형

 왼쪽 -> 오른쪽

 ==, !=

등호 

 왼쪽 -> 오른쪽

 &

비트 AND 

 왼쪽 -> 오른쪽

 ^

배타적 비트 OR (XOR)

 왼쪽 -> 오른쪽

 |

포괄적 비트 OR 

 왼쪽 -> 오른쪽

 &&

 논리적 AND

 왼쪽 -> 오른쪽

 ||

논리적 OR 

 왼쪽 -> 오른쪽

 ?:

조건식 

 오른쪽 -> 왼쪽 



나머지 연산자(%) : 한번에 두가지 일(몫: /, 나머지: %)을 하는 연산자 입니다.


증감연산자 ( ++ , -- ) : 해당 변수를 1씩 증가시키는 연산자입니다.

  단항 연산자이므로 일반적으로 쓰이는 i = i + 1 과 같은 이항연산자로 표현시 기계어 번역 후 AND 연산을 하므로 속도저하가 발생합니다. 증감연산자는 INC(increment) 연산을 하므로 더욱 빠릅니다.

  하지만 요즘 컴파일러의 최적화 기능이 쾌적해져서 알아서 최적화를 실시하여 큰 의미가 없습니다. 그러므로 편한 거 쓰시면 될 것 같습니다.


  증감연산자는 인수가 int 형식이여야 하며, Prefix인지 Postfix인지에 따라 연산결과가 달라집니다.

Prefix(전위형) : 증감연산자가 피연산자 앞에 위치합니다. ++i, --i

Postfix(후위형) : 증감연산자가 피연산자 뒤에 위치합니다. i++, i--


전위형과 후위형은 혼자 쓰일 때는 i=i+1, i+=1 과 다른 것이 없지만 수식 안에서 사용될 때 그 증감 원리 때문에 차이가 발생합니다. 전위형은 값을 증감 시킨 후 그 값을 리턴하지만, 후위형은 값을 리턴한 뒤, 증감시킵니다.

ex)

#include <stdio.h>

void main()
{
     int i;
 
     i=3;
     printf("전위형 : %d\n",++i);
 
     i=3;
     printf("후위형 : %d\n",i++);
} 

  후위형으로 쓸 경우 i=3이라는 선언 값을 리턴 한 뒤, i 값을 1 증가시키므로 3이 출력되는 것을 볼 수 있습니다.


관계식

  &: 비트연산자(비트단위로 저장 가능), &&: 관계연산자(진리값으로 만들어줌)


비트 연산자의 종류는 다음과 같습니다.

AND &  : 0을 연산하여 해당 비트를 0으로 설정합니다.

(해당비트 확인 a = a(a&(1<<n))>>n; )  

OR |    : 1을 연산하여 해당 비트를 1로 설정합니다.

(해당비트 활성화 a = a | 8; (a = a|(1<<n); )

XOR ^  : 암호화 혹은 화면갱신 없이 진행시킬때 활용합니다.

NOT ~  : 1의 보수 (1 ->0, 0 -> 1 )


조건문

조건문은 프로그램의 실행 흐름을 제어하는 문법입니다.

if (condition) command;

if (condition) {
    command 1;
    command 2;
}

if ~ else ~

if (condition) command 1;
else command 2;

조건연산자는 값을 대입합니다.


중첩조건문


if (condition) command 1;
else{
if (condition) command 2;
else command 3;
}

if (condition) command 1;
else if (condition) command 2;
else command 3;

else if 는 위의 else 와 if 의 응용형태입니다.

if문을 사용할 때에는 확률이 높은 것을 조건문의 위에 배치하여 효율성을 높여야 합니다.

컴퓨터는 앞에서도 말씀드렸듯 똑똑하지만 모자란 친구라 줄 단위로 프로그램을 읽는데요.

이 과정에서 if문을 만나면 조건에 부합하는 명령을 실행한 뒤, 다음 조건들은 뛰어 넘기 때문에 그만큼 실행과정을 줄일 수 있기 때문입니다.


Switch


switch (const) {
    case const 1:
        command 1;
        break;
    case const 2:
        command 2;
        break;
    Default:
        command 3;
}

Switch문은 복잡한 조건부 및 분기작업을 제어하는데 도움이 됩니다. 

switch (i) {
    case -1:
        n++;
        break;
    case 0:
        m++;
        break;
    case 1:
    case 3:
    case 5:
        printf("1,3,5 중 하나군요");
        break;

    Default:
        printf("what?");
}

  switch문과 case는 함께 쓰이며, 여러개의 케이스들을 한 switch에 넣을 수 있습니다. 여러 캐이스를 한번에 수행할 수도 있고, 해당 케이스에 포함되지 않는 나머지는 default 문의 명령을 수행하는 구조를 가지고 있습니다.

  C에서 Switch문의 case 값수를 제한하지 않으며 사용가능한 메모리에 의해서만 제한됩니다.



반복문

  반복문은 문장을 반복하여 수행할 때 사용하는 문법입니다.


For(시작조건; 종결조건; 조건변화식)

  For 문을 사용하면 지정한 횟수만큼 혹은 무한하게 반복할 수 있습니다. 선택조건이 False가 될 때 까지 0번 이상 실행됩니다. 이말은 한 번도 실행하지 않고 for문이 닫혀버릴 수 있다는 뜻입니다.


//간단히 무한루프를 만드는 방법
for ( ; ; )

종료가능한 무한루프를 생성하기 위해서는 Break, goto, return문을 사용해야 합니다.(키보드 인터럽트라던지..)


While(종결조건)

while 문을 사용하면 지정된 식이 false가 될 때 까지 반복할 수 있습니다.


While (i >= 0) {
    string1[i] = string2[i];
    i--;
}

위의 예제에서 string2의 문자를 string 1에 복사합니다. 1씩 감소 하면서 반복수행하다가 i 가 0 혹은 그 미만이 되어 더이상 복사할 배열이 없을 때 이 while문이 종결됩니다.


Do ~ while ~


do {
    조건변화식
} while (종결조건);

do while 문은 do 문을 실행한 후 종결조건을 평가하는 문입니다.

따라서 한 번의 실행이 보장되며, 종결조건이 false일 때 까지 반복합니다.

혹은 goto, break, return으로 종료할 수 있습니다.


위의 두가지 반복문에 비해 반드시 한번의 조건변화식 실행을 한다는 점이 특이한 점입니다.


반복문은 코드의 중복을 줄이는 것에 핵심이 있습니다.

반복되는 문장 혹은 명령문장들을 그룹짓고 특정한 작업단위로 문장을 묶음으로써 코드가 단순해집니다.

그러면 코드를 읽기가 쉬워지고 재사용이 가능한 코드를 작성할 수 있습니다.


문법에 대한 더욱 많은 정보는 MSDN을 참조하시기 바랍니다.



매개변수(Parameter)

  매개변수는 한 수를 사용하는 곳에서 부터 처리할 데이터를 넘겨받아 호출된 함수 내부에서 사용할 수 있도록 하는 지역변수를 말합니다. 수학이나 통계학에서 매개변수는 어떠한 시스템이나 함수에서 특정한 성질을 나타내는 변수를 뜻합니다.

  매개변수를 지정하고 사용할 때 대소문자를 가리므로(GetInt != getint) 유의하셔야 하지만 요즘의 컴파일러들은 자동완성기능이 뛰어나기 때문에 큰 신경은 쓰지 않으셔도 됩니다.

  하지만 밑줄(_)을 맨 앞에 놓으면 컴파일러가 아파할 수 도 있기 때문에 지켜주셔야 합니다.


  함수의 반환형은 함수가 특정 작업을 한 뒤 함수를 호출한 곳으로 작업결과를 알려줄 필요가 있을 때 return 키워드를 사용하여 한가지 데이터를 반환할 수 있습니다. 생략시 int로 간주합니다.

  return을 사용하면 함수가 끝나고 그 값을 전달하게 됩니다. 디버깅 시 return문을 사용하여 어디서 문제가 있는지 확인할 수 있습니다.


void new (double x, double y, double z) {
/* 함수의 기능 선언 */
}


자료형과 함수의 이름을 기입하고 이 함수에 쓰이는 자료형들을 선언합니다.

단, void(지금 정해져 있지 않다는 뜻)를 이용할 시 return 값은 특정한 값을 가지면 안되고 return; 으로 끝내야 합니다.


main()

  main 함수는 함수의 집합체로 C에서 프로그램의 시작이 되는 시점입니다. 

  유니코드 프로그래밍을 따르는 코드를 작성할 때 wmain을 사용하셔야 합니다.

  main함수가 void를 반환할 경우 exit 함수를 사용하여 종언하셔야 합니다.


Caller - Callee (호출자 - 피호출자)


  함수에서 다른 함수를 호출할 때 참조할 함수가 받아올 함수보다 밑에 있으면 컴퓨터는 저~~~ 위에서 말씀드렸듯 똑똑하지만 모자란 친구라 이해하지 못합니다. 이 이야기를 유식하게 이야기하면 컴파일러의 컴파일 방식이 Onepass 일 경우 오류가 발생합니다. 위에서 아래로 훑는 컴파일러는 미래의 이야기를 이해하지 못하기 때문입니다.

  그래서, 컴파일러에게 이런 함수가 사용된다는 떡밥을 뿌려주기 위해 프로토타입을 선 호출합니다.


// Function Prototype
int total (int, int); 

int main () {
    ...
}

int total () {
    ...
}


+ Recent posts