第六章语句

2023-07-25  本文已影响0人  徐凯_xp

语句基础

分支语句

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";
constexpr int grade = 80;
if constexpr (grade < 60)
{
    //...
}
int x = 3;
// y的作用域为if-else语句范围内
if (int y = x * 3; y > 100)
{
    std::cout << y << '\n';
}
else
{
    std::cout << -y << '\n';
}

switch

int x;
switch (std::cin >> x; x)
{
    case 3:
        std::cout << "Hello\n";  // fall through
    case 4:
        std::cout << "World\n";
}
int x;
switch (std::cin >> x; x)
{
    case 3:
        std::cout << "Hello\n";
        [[fallthrough]];
    case 4:
        std::cout << "World\n";
}

循环语句

while

do-while

// 错误的语句
do
{
    // ...
} while (int x = 0);

for

for (int i = 0, *p = &i; i < 9; i += 2)
{
    std::cout << i << ' : ' << *p << ' ';
}
std::cout << '\n';

基于范围的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

语句的综合应用——达夫设备

#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
上一篇 下一篇

猜你喜欢

热点阅读