语句C++

Posted 扣得君

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了语句C++相关的知识,希望对你有一定的参考价值。

第5章 语句

C++ 中的大多数语句都已分号结尾,如果编码人员忘记,则会在编译时报错

简单语句

空语句

空语句就是什么也不做的语句,同理也是以分号结尾

//example1.cpp
#include <iostream>
using namespace std;
int main(int argc, char **argv)

    ; //一个空语句
    int i = 0;
    while (i < 5)
    
        ;
        i++;
    
    while (--i > 0)
        ;              //一个空语句
    cout << i << endl; // 0
    return 0;


关于分号

分号我们漏写会报错,多写了则会将多的当做空语句处理,总之不要多写也不要少些,以免出现逻辑上的BUG,往往是难以寻找的

//example2.cpp
#include <iostream>
using namespace std;
int main(int argc, char **argv)

    int i = 1;
    ;
    ;
    // int j //error 没有分号
    //规范的写法为
    // int i = 1;
    // int j;
    return 0;

复合语句块

复合语句是指用花括号括起来的语句和声明的序列,复合语句也被称作为块,在函数、for、if、while、switch等语句都会使用到

块不以分号作为结束

//example3.cpp
#include <iostream>
using namespace std;
int main(int argc, char **argv) // main本身也是个复合语句块

    
        int i = 0;
    
    // cout << i << endl;//error: 'i' was not declared in this scope
    
    int i = 1;
    while (++i < 5)
    
        cout << i << endl; // 2 3 4
    

    //同理可以有空的块
    while (--i > 0)
    
    
    return 0;

语句作用域

可以在块内定义变量,定义在控制结构当中的变量只在响应语句的内部可见,一旦跳出此语句,变量就超出作用范围了

//example4.cpp
#include <iostream>
using namespace std;
int main(int argc, char **argv)

    auto i = 1;
    
        auto i = 2, j = 666;
        cout << i << " " << j << endl; // 2 666
        
            auto i = 999;
            cout << i << endl; // 999
        
        cout << i << endl; // 2
    
    cout << i << endl; // 1
    return 0;

条件语句

if语句

if语句的结构主要有if、else、else if组成

if与else

//example5.cpp
#include <iostream>
using namespace std;
int main(int argc, char **argv)

    bool flag(true);
    //简单的if语句
    if (flag)
        cout << "1" << endl; // 1
    if (!flag)               // no excute
    
        cout << "2" << endl;
    
    // if else
    if (1 > 2)
    
        cout << "1>2" << endl;
    
    else
    
        cout << "1<=2" << endl; // 1<=2
    
    if (1 < 2)
        cout << "1<2" << endl; // 1<2
    else
        cout << "1>=2" << endl;
    return 0;

嵌套if语句

//example6.cpp
#include <iostream>
#include <cmath>
#include <time.h>
using namespace std;
int main(int argc, char **argv)

    srand((unsigned)time(NULL));
    int i = rand() % 10;
    cout << i << endl;
    if (i < 4)
    
        cout << "i<4" << endl;
    
    else if (i >= 4 && i < 7)
    
        cout << "i>=4&&i<7" << endl;
    
    else if (i >= 7 && i < 9)
    
        cout << "i>=7&&i<9" << endl;
    
    else
    
        cout << "i>=9" << endl;
    
    return 0;

要注意的内容,当if、else、else if 后面的代码如果没有加,那么它们默认相当于为后面的一条语句加了花括号,在我们写程序时要格外的注意,以免造成BUG

悬垂else

在if语句嵌套时,它们与else是怎样的匹配关系,else前面如果没有右花括号则它与其上面距离最近的if语句匹配,否则花括号强迫else与其进行匹配

//example7.cpp
#include <iostream>
using namespace std;
int main(int argc, char **argv)

    bool flag = true;
    if (flag)
        if (!flag)
            cout << flag << endl;
        else
            cout << "else" << endl; // else
    //输出 else
    // else是与谁进行了匹配呢 else与距离太最近但尚未匹配的if匹配即第2个if

    //如果用了括号,就很明显直到它们的匹配关系了,即花括号指明了else与谁对应
    if (flag)
    
        if (!flag)
        
            cout << flag << endl;
        
        else
        
            cout << "else" << endl; // else
        
    
    else
    
        cout << "flag is false" << endl;
    

    //可能还有很多其他情况
    if (flag)
        if (!flag)
        
            cout << flag << endl;
        
        else
            cout << "else" << endl; // else
    return 0;

switch语句

什么是switch语句,它是if、else if的升级版 、第一个case相当于if,其余if else相当于后面的case,default相当于末尾的else

//example8.cpp
#include <iostream>
using namespace std;
int main(int argc, char **argv)

    char ch = 'A';
    switch (ch)
    
    case 'A':
        cout << "A Block" << endl; // A Block
        break;
    case 'B':
        cout << "B Block" << endl;
        break;
    case 'C':
        cout << "C Block" << endl;
        break;
    default:
        cout << "not found" << endl;
        break;
    
    //等价于
    if (ch == 'A')
    
        cout << "A Block" << endl; // A Block
    
    else if (ch == 'B')
    
        cout << "B Block" << endl;
    
    else
    
        cout << "C Block" << endl;
    
    return 0;

switch内部的控制流

从第一个匹配成功的case开始执行向下执行直到遇见break或者执行default部分代码块后结束

//example9.cpp
#include <iostream>
using namespace std;
int main(int argc, char **argv)

    char ch('a');
    switch (ch)
    
    case 'a':
        cout << 'a' << endl;
    case 'b':
        cout << 'b' << endl;
    case 'c':
        cout << 'c' << endl;
        break;
    default:
        cout << "not found" << endl;
        break;
    
    //会出现什么情况呢?当ch为a 或 b 或 c时都会执行从其匹配的地方向后执行
    //当 ch=a 输出 a b c
    //当 ch=b 输出 b c
    //当 ch=c 输出 c
    switch (ch)
    
    case 'a':
        cout << 'a' << endl;
    case 'b':
        cout << 'b' << endl;
    case 'c':
        cout << 'c' << endl;
    default:
        cout << "not found" << endl;
        break;
    
    // ch=a时 输出a b c not found
    return 0;

要值得注意的是,case标签必须为整形常量表达式,任何两个case标签的值不能相同,否则会引发错误。 不在每个case代码内些break,本就违反了我们用switch的初心,而且没写好就会因漏写chanshnegBUG。

switch内部的变量定义

可以在case要执行的代码中定义变量,但其中并没有想象的那么简单

//example10.cpp
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char **argv)

    int v = 0;
    switch (v)
    
    case 0:
        // i = 999; 错误i还没有声明
        // cout << i << endl;
    case 1:
        // std::string filename;//错误 控制流可能绕过此初始化语句 string有隐式初始化
        // cout << filename << endl;
        //  int j = 0;错误 控制流可能绕过此初始化语句
        int i;
        break;
    case 2:
        i = 9;
        cout << i << endl; // 9
        break;
    default:
        break;
    
    //其实相当于在case内声明变量,相当于在此case执行时声明变量,在后面各个case内都能使用
    //为什么不能初始化
    //总之可能被绕开的初始化语句是不正确的写法
    return 0;

如何解决这种问题呢

在花括号内初始化、仅在花括号内使用

//example11.cpp
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char **argv)

    int v = 0;
    switch (v)
    
    case 0:
        // i = 999; 错误i还没有声明
        // cout << i << endl;
    case 1:
    
        std::string filename = "cdc";
        cout << filename << endl; // cdc
        int j = 0;
    
        // cout << j << endl; undefined因为filename与j的作用域仅仅在上面的花括号内
        int i;
        // break;
    case 2:
        i = 9;
        cout << i << endl; // 9
        break;
    default:
        break;
    
    //其实相当于在case内声明变量,相当于在此case执行时声明变量,在后面各个case内都能使用
    //为什么不能初始化
    //总之可能被绕开的初始化语句是不正确的写法
    return 0;

//输出 cdc 9

迭代语句

迭代语句在C++内主要有四大类,while语句、传统的for循环、范围的for循环、do while语句

while语句

语法格式

while(condition)
    lang;
while(condition)
    code block

代码样例

//example12.cpp
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main(int argc, char **argv)

    vector<int> vecs1, 2, 3, 4;
    string str = "1234";
    int i = 0;
    auto vec_iter = vecs.begin();
    while (vec_iter != vecs.end() && i < str.size())
    
        cout << *vec_iter << endl;
        cout << str.at(i) << endl;
        i++;
        vec_iter++;
    
    // 1 1 2 2 3 3 4 4
    return 0;

传统for循环

语法格式

for(init-statemen;condition;expression)
    lang;
for(init-statemen;condition;expression)


代码样例

//example13.cpp
#include <iostream>
#include <vector>
using namespace std;
int main(int argc, char **argv)

    for (int i = 0; i < 5; i++)
    
        cout << i << endl;
     // 0 1 2 3 4

    int count = 0;
    for (int i = 0, j = 0; i < 5; i++, j++)
    
        cout << i << " " << j << endl;
        count++;
                          // 0 0 1 1 2 2 3 3 4 4
    cout << count << endl; // 5

    vector<int> vecs = 1, 2, 3, 4;
    vector<int>::iterator iter;
    for (iter = vecs.begin(); iter != vecs.end(); iter++)
    
        cout << *iter << endl;
     // 1 2 3 4
    // init-statemen与expression可以为空,但condition不能为空
    return 0;

范围for循环

C++11引入了一种新的循环方式,可以用来迭代具有迭代器的对象

语法格式

for(declaration:expression)
    statement
for(declaration:expression)


//模式上等价于
for(auto beg=v.begin(),end=v.end();beg!=end;++beg)
    statement

代码样例

//example14.cpp
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main(int argc, char **argv)

    vector<int> vecs1, 2, 3, 4;
    for (auto &num : vecs)
    
        cout << num << endl;
        num++;
     // 1 2 3 4
    for (int &num : vecs)
    
        cout << num << endl;
        num--;
     // 2 3 4 5

    string str = "abcd";
    for (char &ch : str)
    
        cout << ch << endl;
     // abcd
    return 0;

do while循环

do while语句与while语句非常相似,唯一的区别是,do while语句先执行循环体后检查条件,不管条件值如何,我们都至少执行一次循环。

语法格式

do
    statement
while(condition);

代码样例

//example15.cpp
#include <iostream>
using namespace std;

int get_num()

    static int num = 0;
    ++num;
    return num;


int main(int argc, char **argv)

    int num;
    do
    
        num = get_num();
        cout << num << endl;
     while (num < 5);
    // 1 2 3 4 5

    do
        cout << get_num() << endl;
    while (false);
    // 6
    return 0;

跳转语句

主要有三种操作 break语句、continue语句、goto语句

break语句

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

//example16.cpp
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char **argv)

    int i = 0;
    do
    
        cout << i << endl;
        if (i > 3)
        
            break; //离开do while循环
        
        i++;
     while (i < 10); // 0 1 2 3 4

    string str = "abcd";
    for (char &ch : str)
    
        if (ch == 'c')
            break; //离开for循环
        switch (ch)
        
        case 'a':
            cout << ch << endlC++中 语句 #ifndef

给有C或C++基础的Python入门 :Python Crash Course 5 if语句

python3学习,有c++的基础

《好学的C++ 第2版》 第1章 第一个c++程序

Python|python和C++语法中的不同

C++ 标准(源文件的换行符结尾)