语句的常见类别
int main()
{
// 注意下面实际上是两条语句:复合语句和空语句
{cc
// ...
};
}
顺序语句与非顺序语句
最基本的非顺序语句:goto
#include <iostream>
int main()
{
int x = 3;
if (x) goto label;
x = x + 1;
label:
return 0;
}
goto
本质上对应了汇编语言中的跳转指令
if
if
到if-else
else
会与最近的if
匹配// 一个不合原意的应用
// grade > 80 --> Excellent
// grade <= 60 --> Bad
int grade = 65;
if (grade > 60)
if (grade > 80)
std::cout << "Excellent\n";
else
std::cout << "Bad\n";
if
V.S. constexpr if
—— 运行期与编译器分支constexpr int grade = 80;
if constexpr (grade < 60)
{
//...
}
if
int x = 3;
// y的作用域为if-else语句范围内
if (int y = x * 3; y > 100)
{
std::cout << y << '\n';
}
else
{
std::cout << -y << '\n';
}
switch
case
/default
标签 case
后面跟常量表达式(即在编译期可以求值的式子),用于匹配switch
中的条件,匹配时执行后续的代码break
跳出当前的switch
执行default
用于定义缺省情况下的逻辑case
/default
中定义对象要加大括号int x;
switch (std::cin >> x; x)
{
case 3:
std::cout << "Hello\n"; // fall through
case 4:
std::cout << "World\n";
}
[[fallthrough]]
属性int x;
switch (std::cin >> x; x)
{
case 3:
std::cout << "Hello\n";
[[fallthrough]];
case 4:
std::cout << "World\n";
}
if
相比的优劣 while
while
的条件部分不包含额外的初始化内容do-while
do-while
中条件处不支持带花括号或等号初始化器的单个变量的声明。// 错误的语句
do
{
// ...
} while (int x = 0);
for
false
,则终止循环for (int i = 0, *p = &i; i < 9; i += 2)
{
std::cout << i << ' : ' << *p << ' ';
}
std::cout << '\n';
TRUE
for
的更多示例for
循环for
循环的调用方式{
// C++17标准
auto && __range = 范围表达式;
for (auto __begin = 首表达式, __end = 尾表达式; __begin != __end; ++__begin)
{
范围声明 = *__begin;
// 循环语句...
}
}
std::vector<std::string> arr{"h", "e", "l"};
for (const std::string & v : arr)
std::cout << v << '\n';
break
/continue
break
:导致外围的for
、范围for
、while
或do-while
循环或switch
语句终止continue
:用于跳过整个for
、while
或do-while
循环体的剩余部分goto
语句#include <iostream>
#include <vector>
int main (void)
{
constexpr size_t buffer_count = 10000;
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();
switch (buffer_count % 8)
{
case 0 : max_value = (max_value > *ptr) ? max_value : *ptr; ++ptr; [[fallthrough]];
case 7 : max_value = (max_value > *ptr) ? max_value : *ptr; ++ptr; [[fallthrough]];
case 6 : max_value = (max_value > *ptr) ? max_value : *ptr; ++ptr; [[fallthrough]];
case 5 : max_value = (max_value > *ptr) ? max_value : *ptr; ++ptr; [[fallthrough]];
case 4 : max_value = (max_value > *ptr) ? max_value : *ptr; ++ptr; [[fallthrough]];
case 3 : max_value = (max_value > *ptr) ? max_value : *ptr; ++ptr; [[fallthrough]];
case 2 : max_value = (max_value > *ptr) ? max_value : *ptr; ++ptr; [[fallthrough]];
case 1 : max_value = (max_value > *ptr) ? max_value : *ptr; ++ptr;
};
for (size_t i = 0; i < (buffer_count - 1) / 8; ++i)
{
max_value = (max_value > *ptr) ? max_value : *ptr; ++ptr;
max_value = (max_value > *ptr) ? max_value : *ptr; ++ptr;
max_value = (max_value > *ptr) ? max_value : *ptr; ++ptr;
max_value = (max_value > *ptr) ? max_value : *ptr; ++ptr;
max_value = (max_value > *ptr) ? max_value : *ptr; ++ptr;
max_value = (max_value > *ptr) ? max_value : *ptr; ++ptr;
max_value = (max_value > *ptr) ? max_value : *ptr; ++ptr;
max_value = (max_value > *ptr) ? max_value : *ptr; ++ptr;
}
for (size_t i = buffer_count / 8 * 8; i < buffer_count; ++i)
{
max_value = (max_value > buffer[i]) ? max_value : buffer[i] ;
}
std::cout << max_value << '\n';
}
#include <iostream>
#include <vector>
int main (void)
{
constexpr size_t buffer_count = 10000;
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; [[fallthrough]];
case 7 :
max_value = (max_value > *ptr) ? max_value : *ptr;
++ptr; [[fallthrough]];
case 6 :
max_value = (max_value > *ptr) ? max_value : *ptr;
++ptr; [[fallthrough]];
case 5 :
max_value = (max_value > *ptr) ? max_value : *ptr;
++ptr; [[fallthrough]];
case 4 :
max_value = (max_value > *ptr) ? max_value : *ptr;
++ptr; [[fallthrough]];
case 3 :
max_value = (max_value > *ptr) ? max_value : *ptr;
++ptr; [[fallthrough]];
case 2 :
max_value = (max_value > *ptr) ? max_value : *ptr;
++ptr; [[fallthrough]];
case 1 :
max_value = (max_value > *ptr) ? max_value : *ptr;
++ptr;
}
}
std::cout << max_value << '\n';
}
```cc