三目运算符类型转换
2026/8/24大约 2 分钟
C语言三目运算符:类型转换规则
三目运算符:
condition ? expr1 : expr2最容易误解的地方是:
结果类型不是由 condition 决定,而是由
expr1和expr2的类型共同决定。
- 两者类型相同:结果就是该类型
- 一个是
void:另一个也必须是void- 算术类型:按通常算术转换(较窄的提升为较宽的)
- 指针类型:按指针兼容规则转换
一、类型相同
int a = 10;
int b = 20;
1 ? a : b;两边都是 int:
结果类型 → int二、算术类型会进行类型转换
例如:
int a = 10;
double b = 3.14;
1 ? a : b;int 会转换成 double:
int
↓
double
结果类型 → double三、最容易踩坑:signed / unsigned
int a = -1;
unsigned int b = 1;
1 ? a : b;虽然条件为真,看起来应该得到:
-1但三目运算符会先统一 a 和 b 的类型。
int + unsigned int
↓
unsigned int因此:
-1
↓
unsigned int
↓
4294967295 // 常见32位环境所以结果的类型是:
unsigned int四、不要理解成“往大转”
三目运算符不是固定:
小类型 → 大类型而是:
根据 C 的通常算术转换规则,让两个表达式得到一个共同类型。
例如:
int + unsigned
→ unsigned
int + double
→ double所以真正应该记的是:
condition ? A : B
↓
A、B类型统一
↓
得到结果五、指针也有自己的规则
例如:
int *p;
void *q;
1 ? p : q;这里不是进行算术转换,而是按照指针类型兼容规则确定结果类型。
六、最终记忆
三目运算符
↓
condition ? A : B
↓
看 A、B 的类型
↓
统一类型
↓
得到结果尤其看到:
int
unsigned
float
double混在 ?: 两边时,要立刻想到:
先类型转换,再得到三目表达式的结果。

