C++学习笔记04--语句

01语句基础

语句的常见类别:

        表达式语句:表达式后面加分号        3+2;

        空语句:        仅包含一个分号的语句 (可能与循环一起工作)       ;

        复合语句:     由大括号组成,无需在结尾加分号,形成独立的语句域   {  int x;int y;++x;++y}

顺序语句:

        从语义上按照顺序执行

        实际执行顺序可能发生变化(编译器优化  硬件乱序执行)

        与硬件流水线紧密结合   执行效率较高

非顺序语句:

        在执行时引入跳转 ,复杂变化

        分支预测错误可能导致执行性能降低

最基本的非顺序语句:goto 

        通过标签指定跳转到位置

        goto label;             

        label:

goto的缺点:

        不能跨函数跳转

        向前跳转时不能越过对象初始化

        向后跳转时可能导致对象销毁与重新初始化

void fun()
{
    goto label;
    
}

int main()
{
    fun();
label:              error不能跨函数跳转
    return 1;

}
{
    int x=3;
    goto label;  error  向前跳转  未定义
    int y=4;
    label:
    y=y+1;
}
{
    bool flag=true;
    label:
    int x=3;
    if(flag)
    {
        flag=false;
        goto label;   error向后跳转重新初始化
    }
}

不建议使用goto   缺乏结构含义  容易造成逻辑混乱.

02分支语句

if语句

if 语句 - cppreference.comhttps://zh.cppreference.com/w/cpp/language/ifif(条件)语句

if和if  else:

        实现多重分支

        else会与最近的if匹配

        可以使用大括号改变匹配规则

C++17引入了带初始化的if      if(int y=3;y<100){....}

int grade=65;
if(grade>60)
    if(grade>80)
        cout<<"Great"<<endl;
else          与最近的if匹配    与缩进无关
    cout<<"Bad"<<endl;


switch语句

switch 语句 - cppreference.comhttps://zh.cppreference.com/w/cpp/language/switch        switch (条件 ) 语句

条件部分:应当能隐式转化为整形或枚举类型   可以包含初始化语句

case/default标签

        case后面的表达式用于匹配switch的条件  匹配执行后续的代码

        使用beak跳出当前的switch

        default用于定义缺省条件下的逻辑

        在case/default中定义对象需要加大括号

int x;
cin>>x;
switch (x)
{
    case 0:
       break;
    case 1:           case 1 2 3 都会执行case3的逻辑  [[fallthrough]]
    case 2:
    case 3: 
        cout<<"Hello"<<endl;
        break;        break 用于跳出外围的switch循环  continue不能用于switch中
    case 4:
    {
        int y=9;  y只存在当前的分支中(在单独分支中定义变量需要加大括号)
        break;
    }
    default:
        break:
}

03循环语句

while循环

while 循环 - cppreference.comhttps://zh.cppreference.com/w/cpp/language/whilewhile(条件)语句

判断条件是否满足   不满足跳出循环

条件满足  执行循环体

在while条件部分不包含额外的初始化

int x=9;
while(x)   //while(int x=9) error
{
    cout<<x<<endl;
    ++x;

}

do-while循环

do-while 循环 - cppreference.comicon-default.png?t=M4ADhttps://zh.cppreference.com/w/cpp/language/dodo{语句}(条件);    末尾有分号  ;  表示一条语句的结束

处理逻辑:

        1.执行循环体   

        2.判断条件是否满足,不满足跳出循环

        3.条件满足,转向步骤1

int x=8;
do
{
    cout<<x<<endl;
    --x;
}while(x>0)           先执行一次循环再判断



int x=8;
while(x>0)      先判断再循环
{
    cout<<x<<endl;
    --x;
}

for循环

for 循环 - cppreference.comhttps://zh.cppreference.com/w/cpp/language/for正式:   for ( 初始化语句 条件(可选) ; 迭代表达式(可选) ) 语句

非正式: for ( 声明或表达式(可选) ; 声明或表达式(可选) ; 表达式(可选) ) 语句

处理逻辑:

        1.初始化 语句首先执行

        2.条件部分执行   执行结果如果是false    则终止循环

        3.条件为true  执行循环体

        4.迭代表达式会被求值   之后转向2

可以初始化语句中申明多个名字

初始化语句 条件  迭代表达式可以为空

for(int x=0;x<5;++x)  x作用域是整个for循环 
{
    cout<<x<<endl;

}

for(int i=0,*p=&i;i<9;i+=2)   *p是int *
{
    cout<<i<<*p<<endl;
}

for(int i=0,double q=0;i<9;++i)  error  不能这样声明q
{,,}


int *p ,q;   error  
int *p,*q;    q  p都是int*指针

Range-based for

基于范围的 for 循环 (C++11 起) - cppreference.comhttps://zh.cppreference.com/w/cpp/language/range-for

for ( 初始化语句(可选)范围变量声明 : 范围表达式 ) 循环语句

实质:语法糖  编译器会自动转化为for循环

转化形式由C++11------------C++17---------C++20  

使用常量左值引用读元素  const int &v:arr     const auto & v:arr

使用"万能引用"修改元素    auto && v:arr

vector<int>arr{1,2,3,4,5};
for(int val:arr)
{
    cout<<val<<endl;
}


vector<string>arr{"h","e","l","l","o"};
for(const string& v:arr)  常量引用  读
{
cout<<v<<endl;

}

vector<bool>arr{true,false,false};
for(auto&&v:arr)   万能引用  写   v是bool&类型
{
    v=false;

}

break/continue

break 语句 - cppreference.comhttps://zh.cppreference.com/w/cpp/language/breakcontinue 语句 - cppreference.comhttps://zh.cppreference.com/w/cpp/language/continue

break:导致外围的for    range-based for  while   do-while switch语句终止

continue:用于跳过整个for   while    do-while  循环体剩余部分

        二者只能一次跳一个循环   故多重嵌套循环跳转可以用goto

for(int i=0;i<2;i++)
{
    for(int k=0;k<5;k++)
    {
        if(k==3)
        {
            break;  当i=0 k=3时 跳出外围的循环 继续i=1  下的循环   
        }
        cout<<i<<K<<" "<<endl;
    }
}                               00 01 02      10 12 12

for(int i=0;i<2;i++)
{
    for(int k=0;k<5;k++)
    {
        if(k==3)
        {
            continue;  当i=0 k=3时 跳出本次循环 继续i=0 k=4   
        }
        cout<<j<<K<<" "<<endl;
    }                      00 01 02 04        10 11 12 14
}

for(int i=0;i<2;i++)
{
    for(int k=0;k<5;k++)
    {
        if(k==3)
        {
            goto label;  跳到label 
        }
        cout<<j<<K<<" "<<endl;
    }                             00 01 02 over
}
label:
    cout<<"over"<<endl;

04达夫设备

使用循环展开 提升系统的性能

处理无法整除的情况:

        将switch与循环结合--------达夫设备

#include<iostream>
#include<vector>

int main()
{
    constexpr size_t buffer_count=1000;
    std::vector<size_t>buffer(buffer_count);
    for(size_t i=0;i<buffer_count;++i)
    {
        buffer[i]=i;
    }

    size_t max_value=buffer[0];
    auto ptr =buffer.begin();

    size_t i=0;
    switch (buffer_count%8)

        for(;i<(buffer_count+7)/8;++i)
        {
        case 0:max_value=(max_value>*ptr)?max_value:*ptr;++ptr;
        case 7:max_value=(max_value>*ptr)?max_value:*ptr;++ptr;
        case 6:max_value=(max_value>*ptr)?max_value:*ptr;++ptr;
        case 5:max_value=(max_value>*ptr)?max_value:*ptr;++ptr;
        case 4:max_value=(max_value>*ptr)?max_value:*ptr;++ptr;
        case 3:max_value=(max_value>*ptr)?max_value:*ptr;++ptr;
        case 2:max_value=(max_value>*ptr)?max_value:*ptr;++ptr;
        case 1:max_value=(max_value>*ptr)?max_value:*ptr;++ptr;
        }

    std::cout<<"max_val="<<max_value<<std::endl;

    return 0;
}

  switch与for循环结合使用   先switch   case   再for执行

        前提是:switch和for循环体 是相同的内容

持续更新.......................

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值