본문 바로가기

BackEnd/C

함수와 관련된 기타 내용들

반응형

1. 자동형 변환


- 5행에서 전달인자와 function함수의 매개변수의 형이 일치하지 않아 자동형변환이 일어난다.


- 14행에서 double형 상수를 반환하기때문에 int형으로 자동형변환이 일어난다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int function(int n);
 
int main(void)
{
    printf("반환 값: %d \n", function(5.67));//자동 형변환
 
    return 0;
}
 
int function(int n)
{
    printf("입력된 정수: %d \n", n);
 
    return 3.15;//자동 형변환
}
cs



2. 명시적 형변환


- 아래와 같이 명시적 형변환을 해주는 이유는 실수가 아닌 의도적인 구현임을 나타내준다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int function(int n);
 
int main(void)
{
    printf("반환 값: %d \n", function((int)5.67));//명시적 형변환
 
    return 0;
}
 
int function(int n)
{
    printf("입력된 정수: %d \n", n);
 
    return (int)3.15;//명시적 형변환
}
cs


3. printf 함수의 반환과 저장


printf 함수는 문자열의 길이 정보를 반환한다. 


그리고 6행과 달리 5행에서는 반환만 할 뿐 저장을 하지는 않는다. 그리고 다음 문장으로 넘어가면


서 소멸된다. 그렇다면 저장하지 않고 반환만 했던 값은 어디에 저장이 되었던것일까?


1
2
3
4
5
6
7
8
9
10
11
12
int main(void)
{
    int num;
 
    printf("12345\n");
    num = printf("67890\n");
 
    printf("함수의 반환 값 1: %d \n", num);//문자열 길이 반환     
    printf("함수의 반환 값 2: %d \n"printf("Before or After\n"));//문자열 길이 반환
 
    return 0;
}
cs


1
2
3
4
5
12345
67890
함수의 반환 값 16
Before or After
함수의 반환 값 216
cs


     그 답은 CPU관점에서 이해를 해야하는데, 결론적으로 레지스터에 저장이 되있다가 소멸된다.


그에 앞서 CPU구조에서 중요한 2가지를 봐보자




1) ALU(arithmetic logic unit) - CPU내에서 실제 연산을 담당하는 장치이다.


2) 레지스터 -CPU안에 존재하는 아주 작지만 매우 빠른 속도로 동작하는 메모리로 이해하자


CPU안에 메모리가 필요한 이유는? ALU의 고속 연산을 돕기 위해서다.


CPU외부에 있는 메인 메모리로부터 데이터를 직접 읽고 쓴다면 CPU는 연산을 고속으로 처리 못한


다. 그러나 메인 메모리에 저장되어 있는 데이터를 레지스터에 옮겨 놓으면, 고속으로 처리가 가능


하다. 연산에 필요한 데이터를 그만큼 빨리 읽어 들일 수 있기 때문이다.


그리고 레지스터가 존재하지 않을경우와 존재할때의 1+3+5의 연산 차이점을 봐보자





메인 메모리만 존재할때는 연산과정에서 데이터 이동이 총 5회나 있었다.


이러한 이동이 적을수록 속도가 빨라진다.



하지만 레지스터가 존재할경우에는 데이터 이동이 총 3회 발생하였다. 


그리고 레지스터에 저장된 피연산자를 참조하여 합을 계산할것이다. 


이 과정에서 연산 결과 또한 레지스터에 저장한다. 


그리고 위와 마찬가지로 함수의 반환 값도 일단 1차적으로 레지스터에 저장한다.


즉 , 대입 연산자를 사용해 별도의 변수에 연산의 결과나 함수의 반환값을 저장하지 않는다면,


이들 값은 레지스터에 머물다가 소멸된다. 그리고 레지스터에 머물러있는 동안에는 이 값을 얼마든


지 참조할 수 있다. 


그리고 추가적으로 조금 더 생각해보면 함수에 반환형이 필요한 이유를 여기서 찾을 수 있다.


함수 호출이 완료되면서 반환되는 값은 레지스터에 저장이 된다고 하였고, 메모리 공간에 적절히 


데이터를 저장 할려면 정수형인지?실수형인지? 값은 몇 바이트로 저장할 것인지를 결정해야 하기


때문에 반환형 정보가 명시되어야 한다. 


그래야 레지스터에 어떻게 데이터를 표현할지(저장 및 참조)결정 할 수 있다.





반응형

'BackEnd > C' 카테고리의 다른 글

if~else문  (0) 2019.03.03
scanf함수를 이용한 정수와 실수의 입력  (0) 2019.02.26
함수의 선언과 정의  (0) 2019.02.26
다양한 함수의 예  (0) 2018.12.18
함수란 무엇인가?  (0) 2018.12.18