为什么直接输出三目运算结果时得到unsigned long long最大值?
问题原因
这个问题的核心是C++三目运算符的返回类型推导规则,以及无符号整数的隐式转换逻辑:
std::string::length()的返回类型是std::size_t,这是标准库定义的无符号整数类型,64位系统下通常就是unsigned long long。- 三目运算符
条件 ? 表达式1 : 表达式2的返回类型是两个表达式的公共兼容类型,遵循C++通常算术转换规则:同宽度的无符号整数和有符号整数共同运算时,有符号整数会被隐式转换为无符号整数。
你的代码中,表达式1是长度比较结果(类型std::size_t,无符号),表达式2是-1(类型int,有符号),因此整个三目表达式的返回类型会被推导为std::size_t。当两个字符串相等触发返回-1的分支时,-1会被隐式转换为无符号的std::size_t,而补码表示下-1转换为同宽度无符号整数的结果就是该类型的最大值,也就是你看到的unsigned long long最大值。
为什么其他写法能正常运行
- 用if-else分支时,两个分支的输出逻辑完全独立:相等时直接输出独立的
-1(有符号int,正常输出),不等时输出长度值(无符号std::size_t,正常输出),不存在类型合并推导的过程,不会触发隐式转换。 - 先把表达式结果存入有符号类型变量(比如
long long)时,即使三目表达式返回的是无符号的最大值,补码表示下的同宽度无符号最大值赋值给有符号整数时,会被解析为-1,因此输出正常。
为什么单独转换-1的类型没用
你之前只把-1强制转换为long long或者unsigned long long无法解决问题,因为只要表达式1的类型还是无符号的std::size_t,推导出来的公共返回类型依然是无符号整数,-1还是会被转换为无符号最大值。
解决方案
主动将长度比较的结果转换为有符号整数,让两个分支的公共类型为有符号类型即可:
#include<iostream> int main(){ std::string a,b; std::cin>>a>>b; std::cout<<(a!=b?static_cast<long long>(std::max(a.length(),b.length())):-1); }
内容的提问来源于stack exchange,提问作者Muhamed Elsayed
相关产品推荐
相关产品推荐

