C++学习笔记(1)

基础知识

编译、运行程序

命令行运行编译器:

$ CC prog1.cc //CC是编译器程序的名字,$是系统提示符

运行程序:

$ ./a.out

获取main的返回值:

$ echo $?            //UNIX系统
$ echo %ERRORLEVEL%  //Windows系统

UNIX当中可执行文件没有后缀,Windows当中,后缀为.exe
注:根据使用的GNU编译器的版本,可能需要指定-std=c++0x参数来打 开对C++11的支持

输入输出

标准输入对象:名为cin的istream类型的对象
标准输出对象:名为cout的ostream类型的对象
输出警告对象:名为cerr的ostream类型的对象
错误消息对象:名为clog的ostream类型的对象
向流写入数据

std::cout << "Enter two numbers:" << std::endl;

向流读取数据

int v1 = 0, v2 = 0;
std::cin >> v1 >> v2;

endl 操纵符,将与设备关联的缓冲区中的内容刷到设备中
std 命名空间
:: 作用运算符
》 输入运算符
《 输出运算符

注释

单行注释: 以双斜线(//)开始,以换行符结束
界定符对注释: 以/开始,以*/结束
注释界定符不能嵌套,一个注释不能嵌套在另一个注释之内

while 语句

反复执行一段代码,直至给定条件为假为止
其形式为:

while(condition)
    statement

执行过程:交替检测condition条件和执行关联的语句statement,直至condition为假时停止

//用while实现从1加到10
#include 
int main()
{
    int sum = 0, val = 1;
    while(val <= 10)
    {
        sum += val;
        ++val;
    }
    std::cout << "Sum of 1 to 10 inclusive is""
              << sum << std::endl;
    return 0;
 }

do while 语句

先执行循环体后检查条件
语法形式为:

do
    statement
while(condition);

for 语句

其形式为:

for(init-statement; condition; expression)
    statement

每个for语句都包含两个部分:循环头和循环体
循环头包括三部分组成:初始化语句init-statement、循环条件condition以及表达式expression
init-statement必须是以下三种形式的一种:声明语句、表达式语句或空语句

//用for实现从1加到10
#include 
int main()
{
    int sum = 0;
    for(int val = 1; val <= 10; val++)
        sum += val;
    std::count << "Sum of 1 to 10 inclusive is"
               << sum << std::endl;
    return 0;
}

范围for语句

形式为:

for(declaration : expression)
    statement

declaration定义一个变量,序列中的每个元素都得能转换成该变量的类型,确保类型相容最简单的办法是使用auto类型说明符

if语句

作用是:判断一个指定的条件是否为真,根据判断结果决定是否执行另外一条语句
其形式为:

if(condition)
    statement

if else 语句形式是:

if(condition)
    statement
else
    statement2

悬垂 else:规定了else与离它最近的尚未匹配的if匹配,消除程序的二义性

switch 语句

提供了一条便利的途径使我们能够在若干固定选项中做出选择
case 关键字和它对应的值一起被称作case 标签,case 标签必须是整型常量表达式
如果没有任何一个case标签能匹配上switch表达式的值,程序将执行紧跟在default标签后面的语句
如果在某一个带有初值的变量位于作用域之外,在另一处该变量位于作用域之内,则从前一处跳转到后一处的行为是非法行为
如果需要为某个case分支定义并初始化一个变量,我们应该把变量定义在块内,确保后面的所有case标签都在变量的作用域之外

跳转语句

break 语句

负责终值离它最近的while、do while、for或switch语句,并从这些语句之后的第一条语句开始继续执行

continue 语句

终止最近的循环中的当前迭代并立即开始下一次迭代,只能出现在for、while和do while循环的内部,或者嵌套在此类循环里的语句或块的内部,只有当switch语句嵌套在迭代语句内部时,才能在switch里使用continue

goto 语句

从goto语句无条件跳转到同一函数内的另一条语句
语法形式为:

goto label;

label是用于标识一条语句的标示符,带标签语句是一种特殊的语句,在它之前有一个标示符以及一个冒号
goto语句同样不能绕过一个带初始化的变量定义

try 语句块和异常处理

try语句块通用语法形式为:

try{
    program-statement
}catch(exception-declaration){
    handler-statements
}catch(exception-declaration){
    handler-statements
}

catch一旦完成,程序跳转到try语句块最后一个catch子句之后的那条语句进行执行
throw 表达式:异常检测部分使用 throw 表达式来表示它遇到了无法处理的问题,throw 引发了异常
try 语句块:异常处理部分使用try语句块处理异常,try语句块以关键字try开始,并以一个或多个catch字句结束
异常被抛出时,首先搜索抛出该异常的函数,如果没有找到匹配的catch子句,终止该函数,并在调用该函数的函数中继续寻找,如果还是没有找到匹配的catch子句,这个新的函数也被终止,继续搜索调用他的函数,以此类推,沿着程序的执行路径逐层回退,直到找到适当类型的catch子句为止,如果最终还是没能找到任何匹配的catch子句,程序转到名为terminate的标准库函数

标准异常

C++标准库定义了一组类,用于报告标准库函数遇到的问题,这些异常类也可以在用户编写的程序中使用,分别定义在4个头文件中:
· exception 头文件定义了最通用的异常类 exception,它只报告异常的发生
· stdexcept 头文件定义了几种常用的异常类
· new 头文件定义了 bad_alloc 异常类型
· type_info 头文件定义了 bad_cast 异常类型

 定义的异常类
exception                       最常见的问题
runtime_error                   只有在运行时才能检测出问题
range_error                     运行时错误:生成的结果超出了有意义的值域范围
overflow_error                  运行时错误;计算上溢
underflow_error                 运行时错误;计算下溢
logic_error                     程序逻辑错误
domain_error                    逻辑错误;参数对应的结果值不存在
invalid_argument                逻辑错误;无效参数
length_error                    逻辑错误:试图创建一个超出该类型最大长度的对象
out_of_range                    逻辑错误:使用一个超出有效范围的值

常见的编译器可以检查出的错误

1.语法错误

//错误:main的参数列表漏掉了
int main()
{
    //错误:endl后使用了冒号而非分号
    std::count << "Read each file" << std::endl:
    //错误:字符串字面常量的两侧漏掉了引号
    std::count << Update master << std::endl;
    //错误:漏掉了第二个输出运算符
    std::count << "Write new master" std::endl;
    //错误:return 语句漏掉了分号
    return 0
}

2.类型错误

典型错误:向一个期望参数为int的函数传递了一个字符串字面值常量

3.声明错误

#include 
int main()
{
    int v1 = 0, v2 = 0;
    std::cin >> v >> v2;   //错误:使用了“v”而非“v1”
    //错误:count未定义;应该是std::count
    count << v1 + v2 << std::endl;
    return 0;
}

文件重定向

允许将标准输入和标准输出与命名文件关联起来:

$ addItems outfile

addItems.exe是编写的可执行文件,上述命令将从一个名为infile的文件读取,并将输出结果写入到一个名为outfile的文件中,两个文件都位于当前目录中

成员函数

成员函数是定义为类的一部分的函数,有时也被称为方法,通常以一个类对象的名义来调用成员函数

部分术语表

参数(实参):向函数传递的值
赋值:抹去一个对象的当前值,用一个新值取代之
内置类型:由语言定义的类型,如:int
类:一种用于定义自己的数据结构及其相关操作的机制
类类型:类定义的类型
数据结构:数据及其上所允许的操作的一种逻辑组合
编辑-编译-调试:使程序能正常执行的开发过程
文件结束符:系统特定的标识,指出文件中无更多数据了
库类型:标准库定义的类型,如istream
字符串常量:零或多个字符组成的序列,用双引号包围

练习1.1: 查阅你使用的编译器的文档,确定它所使用的文件命名约定,编译并运行第2页的main程序

int main()
{
    return 0;
}

C++学习笔记(1)_第1张图片

练习1.2:改写程序,让它返回-1。返回值-1通常被当作程序错误的标识。重新编译并运行你的程序,观察你的系统如何处理main返回的错误标识

int main()
{
    return -1;
}

C++学习笔记(1)_第2张图片

练习1.3:编写程序,在标准输出上打印Hello, World

int main()
{
    std::cout << "Hello, World" << std::endl;
}

C++学习笔记(1)_第3张图片

练习1.4:我们的程序使用加法运算符+来将两个数相加。编写程序使用乘法运算符*,来打印两个数的积

int main()
{
    int a = 1, b = 2, c;
    c = a * b;
    std::cout << c << std::endl;
    return 0;
}

C++学习笔记(1)_第4张图片

练习1.5:我们将所有输出操作放在一条很长的语句中。重写程序,将每个运算对象的打印操作放在一条独立的语句中

int main()
{
    int a = 1, b = 2, c = 3;
    std::cout << "a = " << a << ", b = " << b << ", c = " << c << std::endl;
    return 0;
}

C++学习笔记(1)_第5张图片

练习1.6:解释下面程序片段是否合法

std::cout << "The sum of " << v1;
          << " and " << v2;
          << " is " << v1 + v2 << std::endl;

如果程序是合法的,它输出什么?如果程序不合法,原因何在?应该如何修正?

不合法,除了最后一行每一行的最后不应该存在;,;表示语句结束,应该修正为:
std::cout << "The sum of " << v1
          << " and " << v2
          << " is " << v1 + v2 << std::endl;
      

练习1.7:编译一个包含不正确的嵌套注释的程序,观察编译器返回的错误信息

int main()
{
    /*
        i am a student
        /*
            i like cat
        */
    */
    return 0;
}

C++学习笔记(1)_第6张图片

练习1.8:指出下列哪些输出语句是合法的(如果有的话)

std::cout << "/*";
std::cout << "*/";
std::cout << /* "*/" */;
std::cout << /*"*/"/*"/*"*/;

预测编译这些语句会产生什么样的结果,实际编译这些语句来验证你的答案(编写一个小程序),每次将上述一条语句作为其主体,改正每个编译错误
C++学习笔记(1)_第7张图片

第1、2、4句合法
第3句改正后为:
std::cout << /* "*/" */ ";

练习1.9:编写程序,使用while循环将50到100的整数相加

int main()
{
    int sum = 0, i = 50;

    while(i <= 100)
    {
        sum += i;
        i++;
    }

    std::cout << sum << std::endl;
    return 0;
}

C++学习笔记(1)_第8张图片

练习1.10:除了++运算符将运算对象的值增加1之外,还有一个递减运算符(--)实现将值减少1。编写程序,使用递增运算符在循环中按递减顺序打印出10到0之间的整数

int main()
{
    int i = 10;

    while(i > 1)
    {
        i--;
        std::cout << i << std::endl;
    }

    return 0;
}

C++学习笔记(1)_第9张图片

练习1.11:编写程序,提示用户输入两个整数,打印出这两个整数所指定的范围内的所有整数

int main()
{
    int a, b, i, max, min;
    std::cout << "please input two number" << std::endl;
    std::cin >> a >> b;
    if(a > b)
    {
        max = a;
        min = b;
    }else
    {
        max = b;
        min = a;
    }

    i = min;

    while(i < max - 1)
    {
        i++;
        std::cout << " " << i << " ";
    }
    std::cout << std::endl;
    return 0;
}

C++学习笔记(1)_第10张图片

练习1.12:下面的for循环完成了什么功能?sum的终值是多少?

int sum = 0;
for(int i = -100; i <= 100; ++i)
    sum += i;

答:计算从-100到100的和,sum的终值为0

练习1.13:使用for循环重做1.41节中的所有练习(第11页),即1.9、1.10、1.11

1.9
int main()
{
    int sum = 0, i = 50;

    for(int i = 50; i <= 100; i++)
        sum += i;
    std::cout << sum << std::endl;
    return 0;
}

1.10
int main()
{
    for(int i = 9; i > 0; --i)
        std::cout << i << std::endl;
    return 0;
}

1.11
int main()
{
    int a, b, i, max, min;
    std::cout << "please input two number" << std::endl;
    std::cin >> a >> b;
    if(a > b)
    {
        max = a;
        min = b;
    }else
    {
        max = b;
        min = a;
    }

    i = min;

    for(i = min + 1; i < max; i++)
        std::cout << " " << i << " ";
    std::cout << std::endl;
    return 0;
}

练习1.14:对比for循环和while循环,两种形式的优缺点各是什么?

for循环
循环控制变量的初始化和修改都放在语句头部分,书写形式较简洁,且适用于循环次数已知的情况。在循环语句中定义一个局部变量,循环结束后,局部变量就被释放了。

while循环
循环控制变量的初始化一般放在while语句之前,循环控制变量的修改一般放在循环体中,形式上不如for语句简洁,但它比较适用于循环次数不易预知的情况(用某一条件控制循环)。

两种形式各有优点,但它们是等价的,可以相互转换。

此题答案来自https://blog.csdn.net/qq_41269379/article/details/81669927

练习1.15:编写程序,包含第14页“再探编译”中讨论的常见错误,熟悉编译器生成的错误信息
C++学习笔记(1)_第11张图片

练习1.16:编写程序,从cin读取一组数,输出其和

int main()
{
    int a[10], sum = 0;

    for(int i = 0; i < 10; i++)
        std::cin >> a[i];

    for(int i = 0; i < 10; i++)
        sum += i;

    std::cout << sum << std::endl;

    return 0;
}

C++学习笔记(1)_第12张图片

练习1.17:如果输入的所有值都是相等的,本节的程序会输出什么?如果没有重复值,输出又会是怎样的?

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;
}

C++学习笔记(1)_第13张图片

你可能感兴趣的:(c++)