Série: C++
cpp
142 linhas
· Atualizado 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;
}
Artigos relacionados
C++
c
Atualizado 2026-07-21
deviceAlpha.h
deviceAlpha.h — c source code from the C++ learning materials (C++/Mavis_Homework/FinalProject/deviceAlpha.h).
Ler artigo →
C++
c
Atualizado 2026-07-21
finalproject.c
finalproject.c — c source code from the C++ learning materials (C++/Mavis_Homework/FinalProject/finalproject.c).
Ler artigo →
C++
cpp
Atualizado 2026-07-21
finalproject.cpp
finalproject.cpp — cpp source code from the C++ learning materials (C++/Mavis_Homework/FinalProject/finalproject.cpp).
Ler artigo →
C++
c
Atualizado 2026-07-21
deviceAlpha.h
deviceAlpha.h — c source code from the C++ learning materials (C++/Mavis_Homework/Lab8/deviceAlpha.h).
Ler artigo →
C++
c
Atualizado 2026-07-21
lab8.c
lab8.c — c source code from the C++ learning materials (C++/Mavis_Homework/Lab8/lab8.c).
Ler artigo →
C++
cpp
Atualizado 2026-07-21
lab8.cpp
lab8.cpp — cpp source code from the C++ learning materials (C++/Mavis_Homework/Lab8/lab8.cpp).
Ler artigo →