先看代码#includeiostream int main(void) { bool b1 -1, b2 false; int x 0; x b1 -1 ? -1 : b1 false ? 0 : b1; std::cout x; }这段代码的输出是1。核心分析有 3 点bool b1 -1;-1赋值给bool时非 0 都会转成true所以此时b1的实际值是true。条件表达式的实际结构是x (b1 -1) ? -1 : ((b1 false) ? 0 : b1);因为的优先级高于?:而且?:是右结合。分步计算b1 -1这里不是“都表示真所以相等”而是做数值比较。b1会先提升为int即true - 1所以变成1 -1 // false接着看b1 false同样变成1 0 // false所以最终取最后一个分支x b1;b1是true赋给int后变成1。所以最终std::cout x;输出1这里最容易错的点是把b1 -1理解成“true和-1都算真所以相等”。在 C 里这里比较的是转换后的具体值不是“真假语义”。