尽管您认为您的代码与此类似:
#include <iostream>
double f()
{
double x = 3;
return x * -1;
}
int main()
{
std::cout << f() << std::endl;
}
x
从向量的结果
size()
std::size_t
:
#include <cstdint>
#include <iostream>
double f()
{
std::size_t x = 3;
return x * -1;
}
int main()
{
std::cout << f() << std::endl;
}
标准:尺寸
乘以
int
. 当一个参数被签名,一个未签名时的提升规则表明(来源:
CppReference
)
如果无符号操作数的转换秩大于或等于有符号操作数的转换秩,则将有符号操作数转换为无符号操作数的类型。
通常比
,所以我们现在将3乘以
(std::size_t)-1
-大量的。当我们
return
,此大数字转换为
double
f()
.
这个问题可以通过以下几种方式避免:
-
存储的结果
大小()
-
转换结果
大小()
static_cast<>
乘法时为有符号或浮点类型。
-
-1.0
)-这将导致另一个参数提升为浮点。