测试_第03章_运算符.cpp

← 测试总览 · 目录

编译运行:clang++ -std=c++26 -Wall -Wextra -pthread 测试_第03章_运算符.cpp -o t && ./t(需先 cd 测试/

// 第3章测试:运算符与表达式
#include <print>
#include <cstdint>

int failures = 0;
#define CHECK(expr)                                                         \
    do {                                                                    \
        if (!(expr)) {                                                      \
            ++failures;                                                     \
            std::println("FAIL 第{}行: {}", __LINE__, #expr);              \
        }                                                                   \
    } while (0)

int main() {
    // 3.1 算术
    int a = 7, b = 2;
    CHECK(a / b == 3);                                  // 整数除法丢小数
    CHECK(a % b == 1);                                  // 取余
    double r = 7.0 / 2;
    CHECK(r == 3.5);
    CHECK(-7 % 2 == -1);                                // 负号跟随被除数

    // 3.2 复合赋值
    int v = 10;
    v += 5;
    CHECK(v == 15);
    v *= 2;
    CHECK(v == 30);

    // 3.3 自增自减前后置
    int i = 0;
    int j = i++;
    CHECK(j == 0 && i == 1);                            // 先取值再加
    int k = ++i;
    CHECK(k == 2 && i == 2);                            // 先加再取值

    // 3.4 比较
    CHECK(a == 7);
    CHECK(a != b);
    CHECK(3 <= 3);

    // 3.5 逻辑与短路
    int calls = 0;
    auto touch = [&]() { ++calls; return true; };
    bool r1 = false && touch();                         // 短路:touch 不执行
    CHECK(r1 == false && calls == 0);
    bool r2 = true || touch();
    CHECK(r2 == true && calls == 0);

    // 3.6 位运算
    CHECK((6 & 3) == 2);                                // 110 & 011 = 010
    CHECK((6 | 3) == 7);
    CHECK((6 ^ 3) == 5);                                // 110 ^ 011 = 101
    CHECK((~0U) == 0xFFFFFFFFU);
    CHECK((1 << 4) == 16);                              // 乘 2^4
    CHECK((64 >> 3) == 8);                              // 除 2^3
    CHECK((7 & 1) == 1);                                // 奇偶判断
    CHECK((8 & 1) == 0);

    // 位标志用法
    int flags = 0;
    flags |= (1 << 0);
    flags |= (1 << 2);
    CHECK(flags & (1 << 0));
    CHECK(flags & (1 << 2));
    CHECK(!(flags & (1 << 1)));

    // 3.7 三目
    int mx = (a > b) ? a : b;
    CHECK(mx == 7);
    int m3 = 1 > 2 ? 1 : 2 > 3 ? 2 : 3;                 // 右结合,结果是 3
    CHECK(m3 == 3);

    // 3.8 优先级用括号
    CHECK(((a & b) == 0) == ((7 & 2) == 2 ? false : true));

    // 3.9 static_cast
    int t = static_cast<int>(3.99);
    CHECK(t == 3);

    if (failures == 0) std::println("全部通过");
    return failures;
}