C++/기초를 탄탄히 세워주는 C++ 프로그래밍 입문(황준하 저)

기초를 탄탄히 세워주는 C++ 프로그래밍 입문 3장 연습문제

꾸준함. 2017. 6. 21. 17:40

[3.1]

/*

int형 값에 대한 절대값을 반환하는 함수 Abs를 매크로와 인라인 함수로 구현해 본다.

두 경우 모두 다음 코드의 반환값은 2가 되어야 한다

Abs(-4+2);

매크로 작성 시에는 매개 변수의 처리에 대해 주의해야 할 것이다.

이를 통해 매크로보다 인라인 함수의 작성이 보다 쉽다는 것을 느끼게 될 것이다.

*/

#include <iostream>

using namespace std;

 

/*

#define Abs(X) (X>0?X:-X) //매크로

*/

 

inline int Abs(int X)

{

        if (X > 0)

               return X;

        else

               return -X;

}

 

int main(void)

{

        cout << "결과:" << Abs((-2 + 4)) << endl;

        return 0;

}

 


[3.2]

/*

다음 프로그램과 같이 int형 변수 var1 var2가 있다.

참조 변수 ref1 ref2를 만들어 각각 var1 var2의 참조 변수로 만들고자 한다.

다음 프로그램에서 잘못된 부분을 찾아 수정하고 출력 결과가 무엇인지 설명해 본다.

*/

#include <iostream>

using namespace std;

 

int main(void)

{

        int var1 = 2, var2 = 3;

        //int &ref1;

        //int &ref2;

        //선언과 동시에 초기화해줘야합니다

        int &ref1 = var1;

        int &ref2 = var2;

 

        //Swap

        int var3 = ref1;

        ref1 = ref2;

        ref2 = var3;

 

        cout << "var1:" << var1 << endl;

        cout << "var2:" << var2 << endl;

        return 0;

}


[3.3]

/*

int형 변수 a에 대한 참조 변수 b를 만들고 a의 값, b의 값, a의 주소, b의 주소를 차례대로 출력해 본다.

그리고 b의 값을 변경한 뒤 a, b의 값을 출력해 본다.

각 변수의 주소를 출력해 봄으로써 참조 변수가 별도의 메모리에 생성되지 않고 기존 변수의 메모리를 공유하게 됨을 알게 될 것이다

*/

#include <iostream>

using namespace std;

 

int main(void)

{

        int a = 5;

        int &b = a;

        cout << "a의 값:" << a << "\tb의 값:" << b << endl;

        cout << "a의 주소:" << &a << "\tb의 주소:" << &b << endl;

 

        b = 3;

        cout << "a의 값:" << a << "\tb의 값:" << b << endl;

        return 0;

}

 


[3.4]

/*

다음 프로그램의 수행 결과는 무엇인가?

*/

#include <iostream>

using namespace std;

 

void update(int var1, int &var2)

{

        var1 += var1; //함수내에서만 증가

        var2 += var2; //참조값이 증가

}

 

int main(void)

{

        int a = 1, b = 1;

 

        for (int i = 0; i < 5; i++)

               update(a, b);

 

        cout << "a=" << a << endl;

        cout << "b=" << b << endl;

        return 0;

}

 


[3.5]

/*

int형 배열과 원소 개수를 매개변수로 전달받아 배열 원소들 전체를 곱한 결과와 더한 결과를 반환하는 함수 하나를

작성하고 main 함수를 통해 테스트해 본다.

함수의 반환값은 2개 이상이 될 수 없다.

따라서 본 문제에서 요구하는 곱한 결과와 더한 결과 2개를 전달하기 위해서는 다른 방법을 모색해야 한다.

아마도 참조 변수가 가장 적절한 선택이 되지 않을까 생각된다.

*/

#include <iostream>

using namespace std;

 

void SumMultiply(int *arr, int len, int &sum, int &multiply)

{

        for (int i = 0; i < len; i++)

        {

               sum += arr[i];

               multiply *= arr[i];

        }

}

 

int main(void)

{

        int arr[5];

        int sum=0, multiply=1;

 

        for (int i = 0; i < 5; i++)

        {

               arr[i] = (i + 1);

        }

 

        SumMultiply(arr, sizeof(arr) / sizeof(int), sum, multiply);

 

        cout << ":" << sum << endl << ":" << multiply << endl;

 

        return 0;

}


[3.6]

/*

다음과 같은 프로그램이 있다.

C++에서는 함수 오버로딩이 가능하므로 이와 같이 2개의 sum 함수가 나올 수도 있다.

여기서 int sum 함수와 double sum 함수 중 어느 한 함수에만 extern "C" 선언을 한 후 컴파일해 보도록 한다.

그리고 두 함수 모두 extern "C" 선언을 한 후 컴파일해 보도록 한다.

두 경우의 컴파일 결과를 설명하고 왜 그런 결과가 나오는지 설명해본다.

*/

#include <iostream>

using namespace std;

/*

int sum(int x, int y)

{

        return (x + y);

}

*/

extern "C" int sum(int x, int y)

{

        return (x + y);

}

 

 

extern "C" double sum(double x, double y) //오버로드된 함수의 두번째 C 링크는 허용되지 않습니다

{

        return (x + y);

}

 

//extern "C" 키워드를 추가함으로써 C++ 컴파일 시 mangled name을 만들지 않고 함수명만으로 linkage를 구성한다.

//C에서는 오버로딩을 허락하지 않으므로 오류가 난다

int main(void)

{

        cout << sum(1, 2) << endl;

        cout << sum(1.1, 2.2) << endl;

        return 0;

}

 

[한쪽만 extern "C" 추가한 경우]


개발 환경:Visual Studio 2017


지적, 조언, 질문 환영입니다! 댓글 남겨주세요~


[참고] 기초를 탄탄히 세워주는 C++ 프로그래밍 입문 황준하 저

반응형