C++ Primer 中文第 5 版练习答案 第 6 章 函数(1~26)

C++ Primer 中文版(第 5 版)练习解答合集

自己写的解答,如有错误之处,烦请在评论区指正!


  1. 实参是值,是一个主调函数传递给被调函数的值,并且是形参的初始值。
  2. a. 函数返回类型应该改成string
    b. 没有写返回类型,如果没有返回类型应该写void
    c. 两个形参的名字不能相同
    d. 函数体没有花括号。
#include <iostream>
using namespace std;
int fact(int n) {
	if (n < 2)	return 1;
	else return n * fact(n - 1);
} 
int main() {
	for (int i = 1; i != 10; ++i)
		cout << "fact(" << i << ") = " << fact(i) << endl; 
	return 0;
} 
#include <iostream>
using namespace std;
int fact(int n) {
	if (n < 2)	return 1;
	else return n * fact(n - 1);
} 
int main() {
	int i;
	while (cin >> i) 
		cout << "fact(" << i << ") = " << fact(i) << endl; 
	return 0;
} 
void printAbs(int n) {
	cout << (n > 0 ? n : -n);
}
  1. 形参属于局部变量(形参和函数体内部定义的变量统称为局部变量),而局部变量又可以分为自动对象(生命周期只存在于块执行期间)和局部静态变量(在程序执行路径第一次经过对象定义语句时初始化,直到程序终止时才被销毁),形参是一种自动对象。
int cntMyself(void) {
	static int cnt = 0;
	return cnt++;
} 
#include <iostream>
using namespace std;
void mySwap(int *a, int *b) {
	int temp = *a;
	*a = *b;
	*b = temp;
} 
int main() {
	int a = 5, b = 2;
	mySwap(&a, &b);
	cout << "a = " << a << ", b = " << b << endl; 
	return 0;
} 
void reset(int &i) {
	i = 0;
}
  1. 引用真香!调用的时候不用取地址,写函数体的时候不用解引用。
#include <iostream>
using namespace std;
void mySwap(int &a, int &b) {
	int temp = a;
	a = b;
	b = temp;
} 
int main() {
	int a = 5, b = 2;
	mySwap(a, b);
	cout << "a = " << a << ", b = " << b << endl; 
	return 0;
} 
  1. 勘误?void f(T&)表示传引用参数。
  2. 形参应该是引用:希望函数修改主调函数里对象的值的时候;
    形参不能是引用:函数在函数体内修改了形参的值,并且主调函数不希望对象的值被修改的时候。
  3. sstring类型,可能会很长,所以使用引用 避免拷贝,同时我们不希望函数体改变s的值,所以加上const前缀;对于c,函数只关心它的值是什么,所以普通地进行值传递就可以了;对于occurs,我们用引用的方法隐式地返回字符出现的次数。
    如果s是普通引用的话存在s的值被修改的风险。
    如果occurs是常量引用的话,其值就不能被修改,也就无法统计字符出现的次数。
  4. 因为这个函数并不修改s的值,所以应该使用常量引用:
    bool is_empty(const string &s) { return s.empty(); }
  5. 形参类型不同,因为containUpper不用修改字符串,而stringToLower要修改。
bool containUpper(const string &s) {
	for (auto ch : s)
		if (isupper(ch))
			return true;
	return false;
}

void stringToLower(string &s) {
	for (auto &ch : s)
		ch = tolower(ch);
}
  1. a. bool compare(matrix &a, matrix &b); 功能:比较两个矩阵是否相等
    b. vector<int>::iterator change_val(int x, vector<int>::iterator it); 功能:修改迭代器指向元素的值为x并返回该迭代器。
  2. a. 不合法。变量过多;
    b. 合法;
    c. 合法;
    d. 合法。
  3. 不会改变的形参都应该是常量引用(尽量用常量引用)。首先会给函数调用者形参可能会被改变的错觉,其次在被别的函数调用的时候,如果别的函数传进来了常量实参会出现错误。
int bigger(int a, int *b) {
	return a > *b ? a : *b;
}
void swapPointer(int **a, int **b) {
	int *temp = *a;
	*a = *b;
	*b = temp;
}
  1. 正确地传递一个具有 10 个整数的数组引用:
    void print(const int (&ia)[10]);
#include <iostream>
using namespace std;
int main(int argc, char *argv[]) {
	if (argc != 3) {
		cerr << "Please input two arguments." << endl;
		return 1;
	}
	string output = argv[1];
	output += argv[2]; 
	cout << output << endl; 
	return 0;
} 
#include <iostream>
using namespace std;
int main(int argc, char *argv[]) {
	if (argc < 1) {
		cerr << "Please input at least one arguments." << endl;
		return 1;
	}
	for (int i = 0; i != argc; ++i)
		cout << "argv[" << i << "] = \"" << argv[i] << "\"" << endl;
	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值