S SmartDocs
系列: C++ cpp 108 行 · 更新於 2026-04-03

variables.cpp

C++/Part1_基礎入門/Ch02_變數與資料型別/variables.cpp

// ============================================================
// Ch02 - 變數宣告與初始化
// 編譯:g++ -std=c++17 -Wall -o variables variables.cpp
// 執行:./variables
// ============================================================

#include <iostream>
#include <string>

int main() {
    // ── 1. 變數宣告與初始化的三種方式 ──
    std::cout << "=== 初始化方式 ===" << std::endl;

    int a = 10;      // 複製初始化(copy initialization)
    int b(20);       // 直接初始化(direct initialization)
    int c{30};       // 列表初始化(list/uniform initialization,C++11)

    std::cout << "複製初始化 a = " << a << std::endl;
    std::cout << "直接初始化 b = " << b << std::endl;
    std::cout << "列表初始化 c = " << c << std::endl;

    // 列表初始化可防止窄化轉換
    // int d{3.14};  // 取消註解會得到編譯錯誤:narrowing conversion

    // ── 2. 僅宣告(未初始化)──
    std::cout << "\n=== 未初始化的危險 ===" << std::endl;
    int uninitialized;
    // 未初始化的區域變數有垃圾值,使用它是未定義行為
    // 以下輸出的值是不確定的
    std::cout << "未初始化的變數值(垃圾值):" << uninitialized << std::endl;

    // ── 3. 多個變數同時宣告 ──
    std::cout << "\n=== 多個變數宣告 ===" << std::endl;
    int x = 1, y = 2, z = 3;
    std::cout << "x = " << x << ", y = " << y << ", z = " << z << std::endl;

    // ── 4. 不同型別的變數 ──
    std::cout << "\n=== 不同型別 ===" << std::endl;
    int age = 25;
    double height = 175.5;
    char grade = 'A';
    bool isStudent = true;
    std::string name = "小明";

    std::cout << "姓名:" << name << std::endl;
    std::cout << "年齡:" << age << std::endl;
    std::cout << "身高:" << height << " cm" << std::endl;
    std::cout << "等級:" << grade << std::endl;
    std::cout << "是否為學生:" << std::boolalpha << isStudent << std::endl;
    // std::boolalpha 讓 bool 值顯示為 "true"/"false" 而非 1/0

    // ── 5. const 常數 ──
    std::cout << "\n=== const 常數 ===" << std::endl;
    const double PI = 3.14159265358979;
    const int MAX_SCORE = 100;
    const std::string SCHOOL = "台大";

    std::cout << "PI = " << PI << std::endl;
    std::cout << "最高分 = " << MAX_SCORE << std::endl;
    std::cout << "學校 = " << SCHOOL << std::endl;

    // PI = 3.14;     // 編譯錯誤!不能修改 const 變數

    // ── 6. auto 自動型別推導(C++11)──
    std::cout << "\n=== auto 自動推導 ===" << std::endl;
    auto num = 42;           // int
    auto pi = 3.14;          // double
    auto letter = 'Z';       // char
    auto flag = false;       // bool
    auto message = std::string("Hello");  // std::string

    std::cout << "num = " << num << " (int)" << std::endl;
    std::cout << "pi = " << pi << " (double)" << std::endl;
    std::cout << "letter = " << letter << " (char)" << std::endl;
    std::cout << "flag = " << std::boolalpha << flag << " (bool)" << std::endl;
    std::cout << "message = " << message << " (string)" << std::endl;

    // ── 7. 變數的作用域(Scope)──
    std::cout << "\n=== 作用域 ===" << std::endl;
    int outer = 100;
    std::cout << "外層 outer = " << outer << std::endl;

    {
        // 內層區塊:可以存取外層變數
        int inner = 200;
        std::cout << "內層 inner = " << inner << std::endl;
        std::cout << "內層存取 outer = " << outer << std::endl;

        // 內層可以宣告同名變數,會遮蔽外層(shadowing)
        int outer = 999;
        std::cout << "遮蔽後 outer = " << outer << std::endl;
    }
    // inner 在這裡已不存在
    // std::cout << inner;  // 編譯錯誤!
    std::cout << "回到外層 outer = " << outer << std::endl;

    // ── 8. 變數命名範例 ──
    std::cout << "\n=== 命名風格 ===" << std::endl;
    int studentAge = 20;          // camelCase
    int student_age = 20;         // snake_case
    const int MAX_SIZE = 100;     // SCREAMING_SNAKE_CASE(常數)

    std::cout << "camelCase: studentAge = " << studentAge << std::endl;
    std::cout << "snake_case: student_age = " << student_age << std::endl;
    std::cout << "常數: MAX_SIZE = " << MAX_SIZE << std::endl;

    return 0;
}

相關文章