[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++ 프로그래밍 입문 황준하 저
'C++ > 기초를 탄탄히 세워주는 C++ 프로그래밍 입문(황준하 저)' 카테고리의 다른 글
기초를 탄탄히 세워주는 C++ 프로그래밍 입문 5장 연습문제 (0) | 2017.06.29 |
---|---|
기초를 탄탄히 세워주는 C++ 프로그래밍 입문 4장 연습문제 (0) | 2017.06.27 |
기초를 탄탄히 세워주는 C++ 프로그래밍 입문 2장 연습문제 (0) | 2017.06.20 |
기초를 탄탄히 세워주는 C++ 프로그래밍 입문 1장 연습문제 (6) | 2017.06.20 |
또 C++ 입문책을 보는 이유 (0) | 2017.06.19 |