本篇是《C++ Primer》(第5版)第1章的习题练习1~8题的答案。
练习1:查阅你使用的编译器的文档,确定它所使用的文件命名约定。编译并运行第2页的main程序。
int main()
{
return 0;
}
练习2:改写程序,让它返回-1。返回值 -1通常被当作程序错误的标识。重新编译并运行你的程序,观察你的系统如何处理main返回的错误标识。
解答:编译上面一个例子,然后在终端输入echo $? 返回的结果为0
把返回0改为返回-1时,然后再编译,运行,在终端输入echo $? 返回的结果为0
int main()
{
std::cout << "hello world===================\\n" << std::endl;
//return -1;
exit(-1);
}
在进行源代码编译,或者执行命令无法确认所执行的命令是否成功执行的情况下,我们都会使用 echo $? 来进行测试。
如果返回值是0,就是执行成功;如果是返回值是0以外的值,就是失败。
之前在学习的时候只是机械的接受了这个事实,没有考虑背后的原理。
这二天在查看资料的时候突然看到了“进程生命周期”的知识:
当一个进程执行完毕时,该进程会调用一个名为 _exit 的例程来通知内核它已经做好“消亡”的准备了。该进程会提供一个退出码(一个整数)表明它准备退出的原因。按照惯例,0用来表示正常的或者说“成功”的终止。
也就是说我们在执行 echo $? 时反回的值就是进程的退出码。而且,这个退出码是由刚刚执行完的进程提供给系统内核的。
int main()
{
return 0;
}
int main()
{
return -1;
}
在 Linux 下,不管你是启动一个桌面程序也好,还是在控制台下运行命令,所有的程序在结束时,都会返回一个数字值,这个值叫做返回值,或者称为错误号 ( Error Number )。
在控制台下,有一个特殊的环境变量 $?,保存着前一个程序的返回值,我们可以试试:
![](https://i-blog.csdnimg.cn/blog_migrate/cfb3e922ad4ac66f822af5e2071b6257.png)
先随便执行个命令,比如像上面的 ls 某些文件,然后通过 echo $?,打印 $? 的值~
我们发现返回值是 0,这是什么意思呢?
只要返回值是 0,就代表程序执行成功了~
也就是说,如果 $? 变量的值不是 0 的话,就表示上一个命令在执行的过程中出错了。我们可以试着 ls 一个不存在的文件:
![](https://i-blog.csdnimg.cn/blog_migrate/e2829d1b9d3cac8f6c53a541f31bd772.png)
#include <iostream>
int main()
{
std::cout << "\nhello world C++ Primer 开始-__-|-__-\n";
return 0;
}
练习4:我们的程序使用加法运行符+来将两个数相加。编写程序使用乘法运行符*,来打印两个数的积。
#include <iostream>
int main()
{
std::cout << "Enter two numbers:" << std::endl;
int param1 = 0;
int param2 = 0;
std::cin >> param1 >> param2;
std::cout << "The sum of " << param1 << " and " << param2 << " is " << (param1 + param2)
<< "The difference of " << param1 << " and " << param2 << " is " << (param1 - param2)
<< "The product of " << param1 << " and " << param2 << " is " << (param1 * param2)
<< "The quotients of " << param1 << " and " << param2 << " is " << (param1 / param2) << std::endl;
std::cout << std::endl;
return 0;
}
练习5:我们将所有输出操作放在一条很长的语句中。重写程序,将每个运算对象的打印操作入在一条独立的语句中。
#include <iostream>
int main()
{
std::cout << "请输入两个数:" << std::endl;
int param1 = 0;
int param2 = 0;
std::cin >> param1 >> param2;
std::cout << param1 << "和" << param2 << "的和为:" << (param1 + param2) << std::endl;
std::cout << param1 << "和" << param2 << "的差为:" << (param1 - param2) << std::endl;
std::cout << param1 << "和" << param2 << "的积为:" << (param1 * param2) << std::endl;
std::cout << param1 << "和" << param2 << "的商为:" << (param1 / param2) << std::endl;
std::cout << std::endl;
return 0;
}
练习6:解释下面程序片段是否合法。
std::cout << "The sum of " << v1;
<< " and " <<v2;
<< " is " << v1+ v2 << std::endl;
如果程序是合法的,它输出什么?如果程序不合法,原因何在?应该如何修正?
#include <iostream>
int main()
{
std::cout << "Enter two numbers:" << std::endl;
int param1 = 0;
int param2 = 0;
std::cin >> param1 >> param2;
std::cout << "The sum和 of " << param1
<< " and " << param2
<< " is " << (param1 + param2) << std::endl;
return 0;
}
分号表示语句的结束, “<<” 之前加上输出流(std::cout),或去掉分号连写成一条语句才可以编译。
练习7:编译一个包含不正确的嵌套注释的程序,观察编译器返回的错误信息。
#include <iostream>
int main()
{
int a = 0;
int b = 0;
std::cout << "a = " << a << " b = " << b << std::endl;
return 0;
}
练习8:指出下外输出语句是合法的(如果有的话):
std::cout << "/*";
std::cout << "*/*";
std::cout << "* "*/* " */;
std::cout << "/ "*/" /* "/*" */;
预测编译这些语句会产生什么样的结果,实际编译实些语句来验证你的答案(编写一个小程序,每次将上述一条语句作为其主体),改正每个编译错误。
#include <iostream>
int main()
{
std::cout << "/*";
std::cout << "*/";
//std::cout << /* "*/" */;
std::cout << /* "*/" */";
std::cout << /* "*/" /* "/*" */; //不赞成这样写,维护性差
return 0;
}