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.comhttps://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.com
https://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循环体 是相同的内容
持续更新.......................