在整数和浮点数上打印操作结果

Ger*_*ard -1 c

考虑以下C程序:

int main() {
    int a =2;
    float b = 2;
    float c = 3;
    int d = 3;
    printf("%d %f %d %f %d %f %d %f\n", a/c, a/c, a/d, a/d, b/c, b/c, b/d, b/d);
    printf("%d\n", a/c);
}
Run Code Online (Sandbox Code Playgroud)

这个输出是:

 0 0.666667 0 0.666667 2 0.666667 0 0.666667
 539648
Run Code Online (Sandbox Code Playgroud)

我根本无法理解这一点.为什么打印a/c为整数给出0,而b/c给出2?在涉及浮点数和整数的计算中,是不是所有整数都被提升为浮点数?所以两种情况下答案都应为0.

在输出的第二行中,我只是将a/c打印为整数,由于某种原因它给出了一个垃圾值(即使它在第一个复合printf语句中打印时它给出了0).为什么会这样?

Ger*_*rdh 6

您有未定义的行为:

printf("%d %f %d %f %d %f %d %f\n", a/c, a/c, a/d, a/d, b/c, b/c, b/d, b/d);
Run Code Online (Sandbox Code Playgroud)

格式说明符printf必须与提供的参数的类型匹配.由于printf没有提供带有类型的参数列表,但...除了标准类型转换之外,没有隐式类型转换.

如果你有UB,基本上任何事情都可能发生.

可能发生的情况如下:

根据格式说明符,printf从调用参数中消耗一定数量的字节.此字节数与指定的格式类型匹配.如果字节数与作为参数传递的字节数不匹配,则所有后续参数都不同步.当然,您对数据的解释不正确.