# C++基础4-控制语句

本文是《C++ Primer Plus》的笔记,本文中的案例均自己实践过,如需转发请在转发开头贴上原文地址,谢谢!

# For循环


for (init;condition;increment) {
    body
}

1
2
3
4
5

执行顺序:

  1. init
  2. condition
  3. body
  4. increment
  5. goto 2

# 表达式和语句

a+b
a+b;
a+b,c+d

第一行就是表达式,第二行就是一个语句。在c++中每个表达式都有值。
第三行是一个逗号表达式,c++规定逗号表达式是最后一个表达式的值,

    int i = 0, b = 1;
    for (; b++, i < 5; i++) {
        cout << i << endl;
    }
    cout << b << endl;
    cout << (i < 5) << endl;
    cout.setf(ios_base::boolalpha);
    cout << (i < 5) << endl;
1
2
3
4
5
6
7
8

# While循环

while(condition){
    body
}

do{
    body
}while(condition);
1
2
3
4
5
6
7

# 实例实战

输入一字符串,如果检测到输入'#',则停止。

//普通输入函数
void InputString(char * inputPtr) {
    char ch;
    cin >> ch;
    int inputLength = 0;
    while (ch != '#') {
        *(inputPtr + inputLength) = ch;
        inputLength++;
        cin >> ch;
    }
    *(inputPtr + inputLength) = '\0';

    cout << inputPtr << endl;
    for (int i = 0; i < inputLength; i++) {
        cout << *(inputPtr + i);
    }
    cout << endl << "------------------" << endl;
}

//使能够录入空格,制表符和换行符
void InputString2(char * inputPtr) {
    char ch;
    cin.get(ch);
    int inputLength = 0;
    while (ch != '#') {
        *(inputPtr + inputLength) = ch;
        inputLength++;
        cin.get(ch);
    }
    *(inputPtr + inputLength) = '\0';

    cout << inputPtr << endl;
    for (int i = 0; i < inputLength; i++) {
        cout << *(inputPtr + i);
    }
    cout << endl << "------------------" << endl;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

# 基于范围的for循环(C++11)

    int arr[2] = { 1,2 };
    for (int x : arr) {
        cout << x << endl;
        x += 1;
    }
    cout << "-------------------" << endl;
    for (int &x : arr) {
        cout << x << endl;
        x += 1;
    }
    cout << "-------------------" << endl;
    for (int x : arr) {
        cout << x << endl;
    }
    cout << "-------------------" << endl;
    for (int x : {1, 3, 5, 7, 9}) {
        cout << x << endl;
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# if语句

if(test-condition){
    body
}else{
    body2
}
1
2
3
4
5

# 逻辑运算符

    int a=0, b = 0;

    if (a > -1 or b++) {
        cout << "body0" << endl;
    }
    cout << a << " " << b << endl;

    if (a > -1 | b++) {
        cout << "body|0" << endl;
    }
    cout << a << " " << b << endl;

    if (a > 0 || b++) {
        cout << "body1" << endl;
    }

    cout << a << " " << b << endl;

    if (a > 0 and b++ ) {
        cout << "body2" << endl;
    }
    cout << a << " " << b << endl;

    if (a > 0 & b++) {
        cout << "body&2" << endl;
    }
    cout << a << " " << b << endl;

    if (a > -1 && b++) {
        cout << "body3" << endl;
    }
    cout << a << " " << b << endl;

    if (!a) {
        cout << "! a" << endl;
    }
    if (not a) {
        cout << "not a" << endl;
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39

# 字符函数库ctype

在头文件ctype中,vs2017好像自带这个。

    cout << isalpha('2')<<endl;
    //0
    cout << isalpha('A')<<endl;
    //1
    cout << isalpha('a')<<endl;
    //2
    cout << isalnum('A')<<endl;
    //1
    cout << isalnum('a')<<endl;
    //2
    cout << isalnum('3')<<endl;
    //4
    cout << iscntrl('\n') << endl;
    //32
    cout << ispunct(',') << endl;
    //16
    cout << isspace(' ') << endl;
    //8
    cout << isupper('A') << endl;
    //1
    cout << isxdigit('b') << endl;
    //128
    cout << tolower('A') << endl;
    //97
    cout << isgraph('@') << endl;
    //16
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

# 为什么这些函数的参数都是int类型?

在C++中,我们通常使用char或unsigned char来表示一个字符,而这些方法中都是int类型,这是因为这些函数除了能接受普通的字符外,还必须接收一个特殊的字符EOF,EOF除了可以表示文件结尾,还可以表示一个无效字符,另外在c++中char可以隐式的转换成int。

C语言规定该头文件的字符处理函数至少要能处理unsigned char 以内的字符,范围以外的字符不做要求,为了让代码兼容性,可以使用<wctype.h>来处理unsigned char 以外的字符。比如在vs2017上:

islower('你');
//上面会出错
#include <wctype.h>
towlower('你');
iswctype('你', wctype("alnum"));
1
2
3
4
5

# 条件运算符

表达式1 ? 表达式2:表达式3
//如果表达式1为真,则返回表达式2的值,否则返回表达式3的值
1
2

# switch语句

switch(integer expression){
    case label1:statement1
    case label2:statement1
    default:statement1
}
1
2
3
4
5

每个label必须是整数常量表达式,比较常见的有int,char,枚举量。

    char chooseChar;
    cin >> chooseChar;
    while (chooseChar!='Q' && chooseChar !='q') {
        switch (chooseChar)
        {
        case 'a':
        case 'A':
            cout << "a or A" << endl;
            break;
        case 'b':
            cout << "b" << endl;
            break;
        default:
            cout << "default break;" << endl;
            break;
        }
        cin >> chooseChar;
    }
    enum class MyColor
    {
        red,
        black,
        white,
        yellow
    };
    MyColor tempColor = MyColor::white;
    switch (tempColor)
    {
    case MyColor::red:
        cout << "red color!" << endl;
        break;
    case MyColor::black:
        cout << "black color!" << endl;
        break;
    case MyColor::white:
        cout << "white color!" << endl;
        break;
    case MyColor::yellow:
        cout << "yellow color!" << endl;
        break;
    default:
        cout << "default color!" << endl;
        break;
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

switch并不是为了处理取值范围而设计的,每个case标签首先必须是一个整型常量,无法处理浮点型。如果选项设计取值范围请使用if else。

# break,continue和goto

    for (int i=0;i<5;i++)
    {
        if(i==1)
            continue;
        if(i==3)
            break;
        cout << i << endl;
    }

    goto finalexec;
    cout << "hello,world" << endl;

finalexec:
    cout << "programs end" << endl;
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 运算符和结合性

  1. 最高优先级的是(),[],->,.;他们的结合顺序是自左至右。
  2. 次级优先级的是!,~,++,--,-(负号运算符不是减号),(类型),*,&,sizeof;他们的结合顺序是自右至左。
  3. 剩下的记住&>|>&&>||.且除了条件运算符和赋值运算符结合方向是自右至左以外剩下运算符都是自左至右。