在预处理器替换中乘以一小部分的问题(#define)

时间:2016-06-07 05:17:07

标签: c c-preprocessor fractions

我想从代码开始

#define myConst (419*0.9)
#define myConst1 (419*.9)
#define myConst9 (myConst1*.9)
#define myConst11 (419*1.1)

int main()
{
    printf("myConst:%d\n",myConst);
    printf("myConst1:%d\n",myConst1);
    printf("myConst9:%d\n",myConst9);
    printf("myConst11:%d\n",myConst11);
    return 0;
}

这给了我输出

  

MYCONST:1913895624个
  myConst1:1个
  myConst9:1个
  myConst11:1

我不知道为什么#define中的一个分数乘以导致与预期值不同的值?此外,myConst的值也在不断变化,例如,我观察到的一些值 -254802840 -1713343480 466029496 。此外 myConst1 myConst9 myConst11 给我1,根据我的说法,这是不合逻辑的。

对此有任何解释是非常受欢迎的。

1 个答案:

答案 0 :(得分:2)

#define在这方面没有任何作用;问题是,当double期待printf时(由于int说明符),您传递了%d;从技术上讲,这是未定义的行为,所以任何事情都可以发生。

现在,如果这是基于32位x86构建的,那么你可能会重新解释浮动的低32位,因为所有参数通常都会在堆栈上传递。但我想这是在64位x86上运行的,如果它们是浮点数,则参数在不同的寄存器中传递。在这种情况下,int只是读取此时某些寄存器中发生的垃圾,这些值中没有太多逻辑。

请注意,几乎所有编译器都可以警告您格式字符串与实际传递的值之间的这种不匹配。对于gcc和clang,我建议您启用此警告(printf,包含在-Wformat中,您肯定启用),并可能将其标记为实际错误({ {1}}),因为没有正当理由像这样做-Wall