C++中numeric_limits静态常量功能及返回值疑问
关于C++ numeric_limits静态常量的疑问解答
教材中的示例代码
bool result3 = numeric_limits<double>::is_signed; //result3 holds a value of true bool result4 = numeric_limits<short>::is_integer; //result4 holds a value of true bool result5 = numeric_limits<float>::is_exact; //result5 holds a value of false
你的疑问
- 是否是检查result3的值是否有符号?但此时result3尚未初始化,逻辑不通。
- 是否是检查double类型整体是否有符号?我知道double可表示负数,却疑惑为何返回true。
你运行的测试代码
#include <iostream> using namespace std; int main() { bool result3 = numeric_limits<double>::is_signed; cout << result3; return 0; }
你预期输出0,但实际输出1,对此感到困惑。
问题解答
首先要明确:numeric_limits<T>::xxx这类静态常量,是查询数据类型T的固有属性,和你定义的变量(比如result3)没有任何关系。
你的第一个理解完全错误,
numeric_limits<double>::is_signed根本不是检查result3的属性——这个变量此时还在初始化阶段,代码逻辑是把类型double的属性值赋值给result3,而不是反过来检查变量。double本身就是有符号类型(可以表示正负数),所以numeric_limits<double>::is_signed的返回值是true。在C++中,cout输出bool类型时,true会被打印为1,false会被打印为0,所以你实际输出1是完全正确的,你的预期错误了。
再补充三个静态常量的具体含义:
is_signed:判断目标类型是否为有符号类型。double、short、int等支持正负值的类型返回true;unsigned int、unsigned char这类无符号类型返回false。is_integer:判断目标类型是否为整数类型。short、int等整数类型返回true;float、double这类浮点类型返回false。is_exact:判断目标类型的运算是否精确。整数类型的运算不会有精度损失,返回true;浮点类型因存储机制限制,无法精确表示所有实数,运算可能存在精度误差,返回false。
内容的提问来源于stack exchange,提问作者Lena_Bean
相关产品推荐
相关产品推荐

