三元条件运算符 (?:) 根据条件计算并返回两个表达式中的一个:
result = cond ? expr_true : expr_false;
int a = 10, b = 0; int max = (a > b) ? a : b; // max = 10
“如果三元运算符的两个表达式返回不同类型的对象(例如,指针和零),结果的类型是什么?”
许多人认为编译器总是能“猜测”结果的类型。实际上,如果其中一个表达式是指针,另一个是 0 或 NULL,那么结果将是指针类型。如果差别更复杂——例如返回不同类型的指针或 int 类型和枚举类型 - 可能会发生明显的信息丢失,有时编译器会报错。
struct node *p = NULL; void *v = cond ? p : NULL; // 可以 void *z = cond ? p : 0; // 可以 int i = cond ? 0 : "abc"; // 错误:不兼容类型
故事
在一个大型跨编译项目中,使用的表达式
cond ? ptr : 0在一个编译器中返回指针,而在另一个编译器中返回 int(其中 0 被严格解释为 int)。当尝试将结果作为指针使用时,系统崩溃。
故事
在一个金融包中,返回函数使用三元运算符与“裸”文字 (
cond ? 0.0 : 1),结果类型因不小心成为了 double,尽管预期为 int,导致了比较和打印中的错误。
故事
在一个库中调用了一个具有副作用的表达式:
flag ? inc(x) : dec(x)。在重构时隐藏的错误:两个表达式都调用了函数(具有各自的副作用),尽管预期只执行一个。由于与嵌套宏的混淆导致了值的双重修改,仅在详细测试过程中发现了这个问题。