1.1 一个简单的C++程序
C++程序从main函数开始。
函数的定义包含四部分:返回类型,函数名,形参列表,函数。
在大多数程序中main函数的返回类型被用于指示状态。
编译运行环境:Linux操作系统g++编译器
1.1 习题
- 练习1.1
编译后运行无任何反应
用下述命令获取返回值,得到0。
echo $?
- 练习1.2
在Linux环境下无任何反应
获取返回值为255
原因:系统用8位无符号数标识退出状态,大于8位的数会被截成8位输出,-1被截的8位数为255。
1.2 输入和输出
C++语言通过标准库提供IO机制,iostream库。
4个IO对象:
- cin:istream类型的对象,称为标准输入
- cout:ostream类型的对象,称为标准输出
- cerr:ostream类型的对象,通常用来输出警告和错误信息,称为标准错误
- clog:ostream类型的对象,通常用来输出程序运行时的一般性信息
以上三个ostream类型的对象在输出数据时,会写到同一个窗口
输出运算符(<<)接受两个运算对象,左侧的运算对象必须是一个ostream对象,右侧的运算对象是要打印的值。此运算符将给定的值写到给定的ostream对象中。输出运算符的计算结果就是其左侧运算对象,既,写入给定值的那个ostream对象。
//下面两行写法等价
//第一个运算符结果为第二个运算符的左侧运算对象
std::cout << "Enter tow numbers: " << std::endl;
(std::cout << "Enter two numbers: ") << std::endl;
输入运算符(>>)与输出运算符类似,它接受一个istream作为其左侧运算对象,接受一个对象作为其右侧运算对象。它从给定的istream读入数据,并存入给定对象中。与输出运算符类似,输入运算符返回其左侧运算对象作为其计算结果。
//下面两行写法等价
std::cin >> v1 >> v2;
(std::cin >> v1) >> v2;
一个简单的带有输入输出的C++程序如下:
#include <iostream>
int main()
{
std::cout << "Enter tow numbers: " << std::endl;
int v1 = 0, v2 = 0;
std::cin >> v1 >> v2;
std::cout << "The sum of " << v1 << " and " << v2 << " is " << v1 + v2 <<std::endl;
return 0;
}
说明:std是命名空间,::是域运算符
注:cin会忽略空格、回车、TAB等分隔符
运行结果如下:
注1:endl为操纵符,作用是结束当前行,并将与设备关联的缓冲区中的内容刷到设备中。缓冲刷新操作可以保证到目前为止程序所产生的所有输入都真正写入输入流中,而不是仅停留在内存中等待写入流。
注2:在运用打印语句进行调试时,应一直保持缓冲刷新操作,否则若程序崩溃,输出可能还停留在缓冲区中,导致错误的推断。
1.2 习题
- 练习1.3
#include <iostream>
int main()
{
std::cout << "Hello, World" << std::endl;
return 0;
}
- 练习1.4
#include <iostream>
int main()
{
std::cout << "Enter tow numbers: " << std::endl;
int v1 = 0, v2 = 0;
std::cin >> v1 >> v2;
std::cout << "The product of " << v1 << " and " << v2 << " is " << v1 * v2 << std::endl;
return 0;
}
- 练习1.5
- 练习1.6
std::cout << "The sum of " << v1;
<< " and " << v2;
<< " is " << v1 + v2 << std::endl;
上述程序片段不合法,只需在最后一行的末尾加分号。
1.3 注释
单行注释://
界定符对注释:/* */
界定符对注释不可嵌套
1.3 习题
- 练习1.7
/*
123
/*hello world*/
456
*/
int main()
{
return 0;
}
编译报错:
原因:界定符对注释不能嵌套,第一个“/*”和第一个“*/”会组合成一对界定符对,第二个“/*”被其包含在内作为注释的内容,第二个“*/”找不到与之对应的“/*”。
- 练习1.8
#include <iostream>
int main()
{
std::cout << "/*" ;//合法
std::cout << "*/" ;//合法
std::cout << /* "*/" */;//不合法,最后一个*/没有与之配对的/*
std::cout << /* "*/" */ "/*" */;//合法
}
程序报错:
1.4 控制流
1.4.1 while语句
//while语句的形式
//当condition判定为真时执行statement,为假时跳出循环
while(condition)
statement
1.4.1 习题
- 练习1.9
#include <iostream>
int main()
{
int val = 50;
int sum = 0;
while(val<=100)
{
sum += val;
val ++;
}
std::cout << "Sum of inegers between 50 and 100 is :" << sum << std::endl;
return 0;
}
运行结果:
- 练习1.10
#include <iostream>
int main()
{
int val = 10;
while(val >= 0)
{
std::cout << val << " ";
val --;
}
std::cout << std::endl;
return 0;
}
运行结果:
- 练习1.11
#include <iostream>
int main()
{
int startNum = 0;
int endNum = 0;
std::cout << "Enter tow numbers: " << std::endl;
std::cin >> startNum >> endNum;
int index = startNum;
while(startNum <= endNum && index <= endNum)
{
std::cout << index << " ";
index ++;
}
while(startNum > endNum && index >= endNum)
{
std::cout << index << " ";
index --;
}
std::cout << std::endl;
return 0;
}
运行结果:
1.4.2 for语句
//for语句的形式
//通过expression中的语句在循环中多次改变表达式的值,最终使condition判定为假,跳出循环,否则将形成死循环
for(init-statement; condition; expression)
statement
for循环执行流程;
1、通过init-statement中的语句进行初始化
2、执行条件语句condition,判定为真则执行循环;判定为假,则循环结束
3、执行expression中的语句
4、重复步骤2和步骤3直至循环结束
1.4.2 习题
- 练习1.12
int sum = 0;
for(int i = -100; i <= 100; ++i)
sum += i;
上述程序实现了从-100到100之间的整数的求和功能,结果为0。
- 练习1.13
#include <iostream>
int main()
{
int sum= 0, index = 0, startNum = 0, endNum = 0;
std::cout << "***Exercise 1.9***" << std::endl;
for(int i = 50; i <= 100; i++)
sum += i;
std::cout << "Sum of inegers between 50 and 100 is: " << sum << std::endl;
std::cout << "-------------------------------------------" << std::endl;
std::cout << "***Exercise 1.0***" << std::endl;
for(int i = 10; i >= 0; i--)
std::cout << i << " ";
std::cout << std::endl;
std::cout << "-------------------------------------------" << std::endl;
std::cout << "***Exercise 1.11***" << std::endl;
std::cout << "Enter tow numbers: " << std::endl;
std::cin >> startNum >> endNum;
for(int i = startNum; i <= endNum && startNum <= endNum; i++)
std::cout << i << " ";
for(int i = startNum; i >= endNum && startNum > endNum; i--)
std::cout<< i << " ";
std::cout << std::endl;
return 0;
}
运行结果:
1.4.3 读取数量不定的输入数据
//书中的示例,不断读取数据直至没有新的输入为止
#include <iostream>
int main()
{
int sum = 0, value = 0;
while(std::cin >> value)
sum += value;
std::cout << "Sum is: " << sum << std::endl;
return 0;
}
while循环条件的求值就是执行表达式
std::cin >> value
由1.2中对输入运算符的说明可知上述表达式的结果为>>运算符的左侧对象,既std::cin。也就是说循环条件实际上检测的是std::cin。
当使用istream对象作为条件时,其效果是检测流的状态。如果流是有效的,即流未遇到错误,那么检测成功。当遇到文件结束符(end-of-file),或遇到一个无效输入时(例如上述例子中读入的值不是一个整数),istream对象的状态会变为无效。处于无效状态的istream对象会使条件变为假。因此上述例子中的while循环会一直执行直至遇到文件结束符(或输入错误)。
Windows系统中输入文件结束符的方式为Ctrl+Z
Unux系统包括Mac OS X系统中输入文件结束符的方式为Ctrl+D
1.4.3 习题
答案即为书中示例。
1.4.4 if语句
//if语句的形式
if(condition)
statement
else if(condition1)
statement
else if(condition2)
statement
......
else
statement
1.4.4练习
- 练习1.17&练习1.18
#include <iostream>
int main()
{
int currVal = 0, val = 0;
if(std::cin >> currVal){
int cnt = 1;
while(std::cin >> val){
if(val == currVal)
++cnt;
else{
std::cout << currVal << " occurs " << cnt << " times " << std::endl;
currVal = val;
cnt = 1;
}
}
std::cout << currVal << " occurs " << cnt << " times " << std::endl;
}
return 0;
}
输入全相等的值:
输入无重复值:
- 练习1.19
对应代码已实现
1.5 类简介
这部分内容书中用一个例子来进行简单讲解,本章不进行记录,留到后面第7章进行具体阐述。
该节中提到了文件重定向机制。使用规则如下:
$ executablefilename <infilename >outfilename
executablefilename:是编译好的可执行文件。
infilename:是作为标准输入的文件名。
outfilename:是作为标准输出的文件名。
(先清空原本输出文件中的所有信息,再写入执行后的结果。)