如何知道C ++程序运行时表达式的类型?

时间:2016-02-02 15:28:04

标签: c++

以下是一个程序:

#include<math.h>
#include<cstring>
#include<iostream>
#include<typeinfo>
int main()
{
    int t;
    std::cin>>t;
    if( std::strcmp( typeid((-1+sqrt(1+8*t))/2).name(), "i" ) == 0 )
        std::cout<<"YES";
    else
        std::cout<<"NO";
    return 0;
}

这里typeid((-1+sqrt(1+8*t))/2).name(),在编译时评估(由老师讲述),因此总是返回f(浮动)或d(小数)。

我想知道一种方法或任何能在运行时告诉我表达式类型的函数。

1 个答案:

答案 0 :(得分:3)

typeid仅告诉您在编译时确定的静态类型。由于sqrt,您正在编写的表达式始终是浮点数。另一方面,typeid(int((-1+sqrt(1+8*t))/2)).name()当然是"i"

但我认为你实际想要的是知道操作是否具有取决于输入的整数结果。您可以做的最好的事情是检查计算值(始终是浮点值!)是否足够接近整数值,例如:

double val = (-1+sqrt(1+8*t))/2;
if (fabs(round(val) - val) < 1e-5) std::cout << "YES"; // and so on

请注意,由于浮点不精确,您永远不能指望该值完全积分。因此,我检查(在此示例中)舍入值和原始值之间的差异小于1e-5

此外,我建议#include <cmath>使用math.h,并使用std命名空间(std::round等功能),等等。