2015년 6월 29일 월요일

20150629 ★변수의 존재기간과 접근범위 지역변수(예제-윤년계산)

모든 변수, 함수선언에는 auto를 써야하나 생략해도 자동으로 적용된다.

전역변수는 프로그램종료전까지 죽지않는다. 아무함수나 다 사용가능
별도의값으로 초기화를 하지 않으면 메모리자체에 비트단위로 0이들어간다.

★컴파일시(컴파일type) 만들어진다.
                           Momery영역
                     (text)code 함수+상수
       (초기화한변수?)data ┐전역변수(int형 변수 1000개는 4000byte)
(초기화하지않은변수)bss  ┘(4000byte를 사용하지 않고 사용할자리를 만들라 명령)
                           heap 동적할당
                           Stack 지역변수(유동성메모리)

★지역변수는 실행시(run type) 만들어진다.

exe파일은 code,data,bss만 실행파일포함 heap,Stack는 실행시 생성

bus가 메모리용량을 결정(메모리의 최종크기는 버스와 관련있다)
32비트체제 4byte(버스가32개)

printf("%x\n", &iNum); // iNum의 메모리주소출력
printf("%08X\n", &iNum); // iNum의 메모리주소출력 8칸을비우고 왼쪽부터채운다.
printf("%p\n", &iNum); // iNum의 메모리주소출력

★cl *.* /link /DYNAMICBASE:NO // 컴파일후 실행시 메모리주소를 고정

#include <stdio.h>
void Add(int val);
int num; // 전역변수는 기본 0으로 초기화됨

int main(void)
{
printf("num : %d\n", num);
Add(3);
printf("num : %d\n", num);
num++; // 전역변수 num의 값 1 증가
printf("num : %d\n", num);
return 0;
}

void Add(int val) // num이 전역변수이므로 반환값 x
{
num += val; // 전역변수 num의 값 val만큼 증가
}


그레고리력은 윤년(2월 윤달)이 있는 해를 다음과 같은 규칙으로 정했습니다.

1) 4년으로 나누어지는 해는 윤달(2월은 29일)이 있다.
2) 그러나 100년으로 나누어지는 해는 윤달이 없다.
3) 그러나 400년으로 나누어지는 해는 윤달이 있다.

이 규칙을 만족해야만 그 해가 윤년(2월은 29일)이고
아닌 경우에는 평년(2월은 28일)입니다.

예제-윤년
#include <stdio.h>

int main(void)
{
int x=0; // 지역변수 Stack부분에 저장되어있음

while(x!=1)
{
  printf("입력(종료=1) : ");
scanf("%d", &x);

/* if(((x%4==0) && !(x%100==0)) || ((x%100==0) && (x%400==0)))
{
printf("윤년\n");
}
else
{
printf("평년\n");
}*/

if(x%400==0)
{
printf("윤년\n");
}
else if(x%100==0)
{
printf("평년\n");
}
else if(x%4==0)
{
printf("윤년\n");
}
else
{
printf("평년\n");
}
}
}

댓글 없음:

댓글 쓰기