'STUDY/C 언어'에 해당되는 글 12건

  1. 2007.03.09 명령어 이해 - volatile
  2. 2007.03.07 명령어 이해 - for 문
  3. 2007.03.02 명령어 이해 - #ifdef / #ifndef / #endif
  4. 2007.03.02 명령어 이해 - if / while / brake
  5. 2007.03.02 명령어 이해 - return 1
2007. 3. 9. 16:33

volatile 은 휘발성 메모리라는 표시로 그 값이 프로그램에서
바꾸지 않아도 바꾸어 질 수 있기 때문에 컴파일러가 옵티마이즈를 하지 않습니다.

보통 하드웨어를 제어하는 곳(디바이스 드라이버)에서 사용하게 되며
프로그램이 그 값을 정의 했더라도 하드웨어에서
자체적으로 다른 값으로 바꿀 수 있는 곳에 사용됩니다.

예를 들어

unsigned int flashRead32 (unsigned int *pFlash, unsigned int offset)
{
    volatile unsigned int dword;
    dword = *(pFlash->base + offset);
    dword = *(pFlash->base + offset);

return (dword);
}

dword를 volatile로 선언 했기때문에 읽으라는 값을 두번 읽지만
그냥 선언 했을 경우에는 한번만 읽은 것 하고 동일한 로직으로 보기 때문에 한번만 수행할 가능성이 높습니다.

특히 딜레이를 주기위하여 for문을 쓰는 경우에 변수정의를 위와 같은 이유로아래와 같이 사용해 주어야 딜레이 값이 확실하게 작용합니다.

volatile unsigned int i;

'STUDY > C 언어' 카테고리의 다른 글

연산자 1  (0) 2007.03.16
데이터형 구조  (0) 2007.03.16
명령어 이해 - for 문  (0) 2007.03.07
명령어 이해 - #ifdef / #ifndef / #endif  (0) 2007.03.02
명령어 이해 - if / while / brake  (0) 2007.03.02
Posted by Paul Hwang
2007. 3. 7. 17:06

for(초기치;종결조건;증가치) ==> 종결 조건이 참이면 for 문을 계속 돌라는 이야기 입니다.
초기치, 종결조건, 증가치 모두 꼭 있을 필요는 없습니다.

즉, for(;;) 도 가능하고, for(i=0;;) 도 가능하고 ... 다 가능합니다.

for(;1;) 또는 for(;2;) ==> 즉 종결조건이 1 또는 2 죠??

C 에서 참 / 거짓을 구분하는 기준은 '0' 을 기준으로 합니다.
따라서 1, 2 는 0 이 아니므로 참입니다.

위의 for 문은 계속 돌라는 얘기가 됩니다.
위의 for(초기치;종결조건;증가치) 는 아래와 같습니다.

초기치;

while(1)
{
    if(!종결조건) // ! 이 중요합니다. 즉 종결조건이 참이 아니면...
    {
        break; // while 문을 끝내라는 명령어죠??
    }

증가치;

}


//예제///////////////////////////////////////////////////////////////

#include <stdio.h>
main( )
{
    int i,s;
    s=0;
    for(i=1; i<=5; i++)
    s=s+i;
    printf("sum=%d\n",s);
}

///////////////////////////////////////////////////////////////////

for(처음 값은 초기값; 두번째값은 조건식; 세번째는 증감연산자)
처음에 초기값은 1번 실행되고
그 다음에 조건식이 참이면 for문 안에 문장을 실행합니다.
문장을 모두 실행후에 증감연산인 i++을 실행합니다

그 다음 다시 조건식이 참이면 포문안에 문장을 실행해서 계속 반복하겟죠.
조건식이 거짓이면 for문이 중지됩니다.

 

'STUDY > C 언어' 카테고리의 다른 글

데이터형 구조  (0) 2007.03.16
명령어 이해 - volatile  (0) 2007.03.09
명령어 이해 - #ifdef / #ifndef / #endif  (0) 2007.03.02
명령어 이해 - if / while / brake  (0) 2007.03.02
명령어 이해 - return  (1) 2007.03.02
Posted by Paul Hwang
2007. 3. 2. 11:57

#define WORD 1

이것은 WORD를 1로 치환한다는 것입니다.
쉬운 예를 들자면 많일 원의 면적을 구하는 프로그램을 짤다고 했을 때
원주율 3.14가 계산에 필요하게 됩니다.

...

int r, s;                // r 은 원의 반지름 길이, s는 원의 넓이
r = 3;
s = 3.14 * r ^ 2;

...

위와 같이 되겠죠. 그런데 이때 원주율 3.14를 좀더 정확하게 3.141592로 바꿔야 한다면 위에는 3.14가 한번밖에 안쓰였지만 3.14를 약 100번정도 사용하였다면 그걸 일일이 다 바꾸는건 엄청난 노가다가 될것입니다.

이럴때

#define PI 3.14

라고 해두면

...

int r, s;                // r 은 원의 반지름 길이, s는 원의 넓이
r = 3;
s =PI * r ^ 2;

...

라는 코드가 만들어 지니까
#define PI 3.141592
라고만 바꾸면 끝이되죠

위의 경우에만 쓰라고 있는건 아니고
#define라는 건
어떤 숫자라든지 긴 정의를 짧게 또는 의미있는 단어로 바꾸어 주는겁니다.

#ifdef WORD
printf("Hello, ");
#endif

여기서 #ifdef WORD 라는 것은 'WORD란 단어가 define가 되어있다면' 이란 뜻입니다.
즉 WORD란 단어가 위에서 #define WORD 1으로 define되어 있으므로 참이 되고
그 다음줄 printf("Hello, ");가 실행되는 거죠

#endif 란 #ifdef 구문이 끝났음을 알리는 겁니다.

#ifndef WORD2 도 비슷합니다.
이것은 #ifdef와는 반대로 'WORD2란 단어가 define되어 있지 않다면'이란 뜻입니다.
즉 WORD2란 단어는 위에서 #define에 의해 define된 적이 없으므로 참이되고
그 다음줄 printf("world/n"); 가 실행이 됩니다.

#ifndef WORD
printf("HaHa\n");

위 에서는 #ifndef WORD에서 WORD는 이미 define되어 있으므로 거짓이 되서
그 다름줄인printf("HaHa\n"); 가 실행되지 않습니다.
즉 출력결과는 Hello world 가 됩니다.

'STUDY > C 언어' 카테고리의 다른 글

명령어 이해 - volatile  (0) 2007.03.09
명령어 이해 - for 문  (0) 2007.03.07
명령어 이해 - if / while / brake  (0) 2007.03.02
명령어 이해 - return  (1) 2007.03.02
전역변수 사용시 주의 할 점  (0) 2007.02.26
Posted by Paul Hwang
2007. 3. 2. 11:52

if는 분기문이고..
while은 loop문입니다..

그럼 분기문과 loop의 차이를 아셔야 하는데...

간단히 설명드리면..
분기문은.. 특정조건을 만족할때 분기문 안에 내용을 실행한다 이고,
loop문은 특정조건을 만족하는 동안 loop문 안에 내용을 반복한다입니다...

말인즉슨...

if(i < 100) {
    i++; // i=i+1;
}
위에 구문은 i가 100 보다 작으면 i에 1을 더하라 고 명령하는것입니다..

while(i < 100) {
    i++; // i=i+1;
}
위에 구문은 i가 100보다 커질때 까지 i를 1씩 더하는 작업을 반복하라 입니다...

전혀 다른 구문이죠...

brake;는 루프문에 만 사용이 가능하며...
가장 가까운 loop를 강제 종료 시킵니다...

int i = 0;

while(i < 100) {
    break;
    i++;             // i=i+1;
}
라고 하면...i=0;으로 끝이 납니다...

int i = 0;

while(i < 100) {
    i++;             // i=i+1;
    break;
}

라고 하면 i는 1로 끝이 나죠...
브레이크의 위치에 따라 loop(반복문의 실행을 순차를 비교해보시면 더 좋을 것입니다.)

자 이제 while을 if로 바꾸면 왜 break;가 에러가 나는냐 라는 질문으로 들어가면...
우선 while은 loop(반복)문이고 if는 분기문 이기 때문에 전혀 다른말이 됩니다.

굳이 따지자면...

if( 나는 대학생){
    공부를 한다.
}

while( 나는 대학생){
    공부를 한다.
}

위와 같이 2개를 예로 들면...
if는 내가 대학생이면 공부를 한다 이고..
while은 내가 대학생인 동안 계속 공부를 한다...
입니다...

비슷해 보이실지 모르겠지만 전혀 다른말입니다.
간단하게 설명하자면 if를 계속 반복하면 while이됩니다...
해서 while을 if로 바꾸면 원하던 결과와 전혀 다른 결과가 나오게 되니 바꾸어선 안될것입니다..

그리고..
break는 loop문에만 사용이 가능한 구문이라 했습니다...
while(반복문)을 if(분기문)으로 교체를하면 당연히 말이 안 되기 때문에 에러를 뱉어 내는것입니다..

Posted by Paul Hwang
2007. 3. 2. 11:49

return 은 두가지 역할을 합니다.

1. 함수의 실행을 끝냅니다.
2. 함수를 호출한 다른 함수나 시스템에게 어떤 값을 돌려줍니다.

return; // 이와 같이 값이 없이 그냥 return을 사용하면 돌려주는 값 없이 함수를 끝낸다는 의미입니다.

return 뒤에 따라오는 값은 함수의 선언 또는 정의와 일치해야 합니다.

int f(); // 함수가 정수형으로 선언되었습니다.

main()
{
    int i;
    i = f();                 // f() 함수가 돌려준 값을 i라는 변수에 넣습니다.
}

int f()                     // 함수의 정의 부분입니다. 역시 정수형입니다.
{
    return 3;             // 이 함수는 3이란 정수값을 돌려줍니다. 
                            // 여기에서 정수가 아닌 값을 돌려주려하면 에러가 됩니다.

}

void 로 선언된 함수는 return; 처럼 돌려주는 값이 없습니다.
그리고 함수의 끝부분에서는 return; 을 생략해도 함수가 끝납니다.
돌려주는 값이 있는 return은 생략할 수 없습니다.

void f(); // 돌려주는 값이 없는 함수입니다.

void f()
{

} // return; 이 생략되었습니다.

int main() 함수의 리턴값은 시스템(OS)이 받습니다.
예를 들어 윈도우즈에서 프로그램을 실행시키면 윈도우즈는
프로그램이
끝날 때 main()함수의 리턴값을 받아서 이 프로그램이 올바로 끝났는지 여부를 판단합니다.

하지만 main()함수는 void로 선언해도 상관 없습니다.
에러 처리는 시스템이 알아서 하니까 최근에는 void로 선언해서 사용합니다.

마지막으로 예전의 C언어에서는 void형 함수를 지원하지 않았습니다.
따라서 모든 함수는 무언가 리턴값이 있어야 했고, 프로그래머들은 필요 없는 리턴값을 코딩에 넣어야 했었습니다.

Posted by Paul Hwang