C语言三目运算符出现意外运算结果,同逻辑b与c值不同求解释
问题原因解答
核心问题和运算符优先级无关,你的优先级规则理解是正确的,差异来源于无符号整数与有符号整数运算的隐式类型转换:
vector<int>::size()的返回值是无符号整数类型size_t,这是C++标准规定的容器大小返回类型,所有标准库容器的size方法都返回该无符号类型。
变量c的计算过程(符合预期)
27 - 29 >=0 ? 27 - 29 : 0的运算全在int类型下进行:
- 27和29都是有符号int,计算
27-29得到有符号int值-2 - 判断
-2 >= 0,结果为假 - 三目运算符返回分支值
0,赋值给c,结果符合预期
变量b的计算过程(不符合预期的原因)
27 - a.size() >= 0 ? 27 - a.size() : 0存在隐式类型转换:
- 计算
27 - a.size()时,a.size()是无符号size_t类型,C/C++的算术运算规则会把有符号int类型的27自动提升为size_t类型,再和值为29的无符号数做减法 - 无符号数的减法结果永远为无符号正数:
27u - 29u得到的是一个极大的正无符号数(而非有符号的-2) - 判断该极大正数
>=0,结果永远为真,三目运算符返回前面的27 - a.size()结果 - 该无符号极大值赋值给有符号int类型的b时,发生有符号数溢出,最终截断得到值
-2
修复方案
如果要得到预期结果,需要手动将size_t强转为有符号int,避免隐式转换:
int b = 27 - (int)a.size() >= 0 ? 27 - (int)a.size() : 0;
更稳妥的写法可以提前把计算结果用int变量存储:
int diff = 27 - (int)a.size(); int b = diff >= 0 ? diff : 0;
内容的提问来源于stack exchange,提问作者Aaron Solomon
相关产品推荐
相关产品推荐

