S SmartDocs
Serie: C++ cpp 142 líneas · Actualizado 2026-06-15

modern_control.cpp

C++/Part1_基礎入門/Ch03_控制流程/modern_control.cpp

// ============================================================
// Ch03 - 現代控制流程:結構化綁定、[[fallthrough]]、
//        短路求值、if 初始化語句、跳出多層迴圈
// 編譯:g++ -std=c++17 -Wall -Wextra -o modern_control modern_control.cpp
// 執行:./modern_control
// ============================================================

#include <iostream>
#include <map>
#include <string>
#include <utility>     // std::pair

// 在二維陣列中搜尋目標值;找到就回傳座標(用 return 跳出雙層迴圈)
static bool findValue(const int grid[3][3], int target, int& row, int& col) {
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            if (grid[i][j] == target) {
                row = i;
                col = j;
                return true;   // 直接離開函式,等於一次跳出兩層迴圈
            }
        }
    }
    return false;
}

int main() {
    // ══════════════════════════════════════════
    // 1. C++17 if 初始化語句
    // ══════════════════════════════════════════
    std::cout << "=== if 初始化語句 ===" << std::endl;

    std::map<std::string, int> stock = {{"蘋果", 3}, {"香蕉", 0}};

    // 變數 it 的作用域僅限於 if / else
    if (auto it = stock.find("蘋果"); it != stock.end()) {
        std::cout << "蘋果庫存:" << it->second << std::endl;
    } else {
        std::cout << "查無此商品" << std::endl;
    }

    // ══════════════════════════════════════════
    // 2. 短路求值(避免越界 / 除以零)
    // ══════════════════════════════════════════
    std::cout << "\n=== 短路求值 ===" << std::endl;

    int data[5] = {10, 20, 30, 40, 50};
    int idx = 10;

    // idx < 5 為 false,右邊的 data[idx] 不會被計算 → 避免越界
    if (idx >= 0 && idx < 5 && data[idx] > 25) {
        std::cout << "data[" << idx << "] 大於 25" << std::endl;
    } else {
        std::cout << "索引 " << idx << " 越界或值不符(短路保護生效)" << std::endl;
    }

    int divisor = 0;
    if (divisor != 0 && 100 / divisor > 5) {
        std::cout << "商大於 5" << std::endl;
    } else {
        std::cout << "除數為 0,短路避免了除以零" << std::endl;
    }

    // ══════════════════════════════════════════
    // 3. switch + [[fallthrough]](故意穿透)
    // ══════════════════════════════════════════
    std::cout << "\n=== [[fallthrough]] 權限累加 ===" << std::endl;

    int level = 3;  // 3=管理員, 2=編輯, 1=訪客
    std::cout << "權限等級 " << level << " 擁有:" << std::endl;

    switch (level) {
        case 3:
            std::cout << "  - 管理權限" << std::endl;
            [[fallthrough]];   // 明確標示故意穿透
        case 2:
            std::cout << "  - 編輯權限" << std::endl;
            [[fallthrough]];
        case 1:
            std::cout << "  - 閱讀權限" << std::endl;
            break;
        default:
            std::cout << "  (無任何權限)" << std::endl;
            break;
    }

    // ══════════════════════════════════════════
    // 4. 範圍 for + 結構化綁定(遍歷 map)
    // ══════════════════════════════════════════
    std::cout << "\n=== 結構化綁定遍歷 map ===" << std::endl;

    std::map<std::string, int> scores = {
        {"小明", 90}, {"小華", 55}, {"小美", 95}, {"阿傑", 48}
    };

    int total = 0;
    std::string topName;
    int topScore = -1;

    for (const auto& [name, score] : scores) {
        std::cout << name << ":" << score;
        total += score;
        if (score < 60) std::cout << "(不及格)";
        if (score > topScore) {
            topScore = score;
            topName = name;
        }
        std::cout << std::endl;
    }

    std::cout << "平均分:" << static_cast<double>(total) / scores.size() << std::endl;
    std::cout << "最高分:" << topName << "(" << topScore << ")" << std::endl;

    // ══════════════════════════════════════════
    // 5. 跳出多層迴圈(抽成函式 + return)
    // ══════════════════════════════════════════
    std::cout << "\n=== 二維搜尋(return 跳出多層)===" << std::endl;

    int grid[3][3] = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };

    int r = -1, c = -1;
    if (findValue(grid, 8, r, c)) {
        std::cout << "在 (" << r << ", " << c << ") 找到 8" << std::endl;
    } else {
        std::cout << "找不到目標值" << std::endl;
    }

    // ══════════════════════════════════════════
    // 6. 結構化綁定拆解 pair
    // ══════════════════════════════════════════
    std::cout << "\n=== 結構化綁定拆 pair ===" << std::endl;

    std::pair<int, int> point = {3, 4};
    auto [px, py] = point;
    std::cout << "座標 = (" << px << ", " << py << ")" << std::endl;

    return 0;
}

Artículos relacionados