代码之家  ›  专栏  ›  技术社区  ›  Max Frai

奇怪的计算

  •  0
  • Max Frai  · 技术社区  · 15 年前

    我不明白为什么我的程序会这样计算:

    #define PixelsPerMeter 40.0
    
    // 40 pixels ~ 1 meter
    #define Meters2Pixels(meters) (float)meters*PixelsPerMeter
    #define Pixels2Meters(pixels) (float)pixels/PixelsPerMeter
    
    // The speed of free falling
    #define G Meters2Pixels(9.81)
    
    // ...
    float mHeight = 768;
    float _windPower = Meters2Pixels(-5.0);
    // ...
    
    float x1 = ( mHeight / G ) * _windPower;
    
    cout << "G: " << G << "; wind: " << _windPower << "\n";
    cout << "Height: " << mHeight << "\n";
    cout << "Calculating: " << mHeight / G * _windPower << "\n";
    
    =>
    G: 392.4; wind: -200
    Height: 768
    Calculating: -626300
    

    我不明白为什么。。。例如,如果我手工计算,我必须得到:

    发生了什么?

    2 回复  |  直到 15 年前
        1
  •  4
  •   codaddict    15 年前

    需要将宏展开式括在括号中,如下所示:

    #define Meters2Pixels(meters) ((float)meters*PixelsPerMeter)
    #define Pixels2Meters(pixels) ((float)pixels/PixelsPerMeter)
    

    C/C++预处理器进行盲替换。没有括号, x1 将计算为:

    float x1 = ( mHeight / (float)9.81*40.0 ) * _windPower;
    

    它分裂了 mHeight 通过 9.81 然后将结果乘以 40.0 高度 除以 9.81 40

    -E 选择 g++ 作为:

    g++ -Wall -E myfile.cpp 
    

    编辑:

    Meters2Pixels(foo + 2) :

    #define Meters2Pixels(meters) ((float)(meters)*PixelsPerMeter)
    #define Pixels2Meters(pixels) ((float)(pixels)/PixelsPerMeter)
    
        2
  •  3
  •   ninjalj    15 年前

    为了避免宏出现问题,应该考虑使用内联函数。