C++17 · Evaluation bench
类型转换、短路与副作用顺序实验室
一条表达式并不是“一次算完”的黑箱。沿着类型、范围和控制流三条轨迹拆开它,才能看清结果在何时被决定。
转换位置,决定小数是否还在
固定输入 total = 11、count = 4。选择表达式,逐步查看每个子表达式的类型与值。
执行管道
最终写入
x先扩宽,还是先相乘?
long long 变量足够宽,不代表右侧乘法自动使用 long long。风险在赋值之前就可能出现。
范围审计
数学乘积
典型 32 位 int 上限2,147,483,647
执行乘法的类型
边界声明
这里仅检查数学结果是否超出典型 32 位
这里仅检查数学结果是否超出典型 32 位
int 范围,不伪造 C++ 有符号溢出后的数值。有符号整数溢出属于未定义行为,不能把某个“回绕值”当作标准结果。控制流决定副作用是否发生
短路运算和条件运算符有明确的门控规则;普通函数调用两侧的先后,则不能靠源代码左右位置来猜。
短路轨迹
left && side_effect()
left || side_effect()
条件运算符:只选一条分支
true_branch()left 为 true 时执行
false_branch()left 为 false 时执行
两种允许的观察轨迹
left() + right()
C++17 结论:这里展示的是两种允许的先后轨迹,而不是用随机动画“模拟标准”。实现可选择其中一种;程序不应依赖自己猜测的固定顺序。两个调用彼此是有先后关系的,但标准没有规定哪一个先执行。