编译运行: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;
}