C程序:帮助变量定义序列

Smo*_*iff 1 c variables floating-point int definition

void main()
{
    float x = 8.2;
    int r = 6;
    printf ( "%f" ,  r/4);
}
Run Code Online (Sandbox Code Playgroud)

很明显,我没有明确地将printf函数中的r(int类型)强制转换为float.但是,如果我改变声明x和r的顺序并首先声明r然后xi得到不同的结果(在这种情况下它是一个垃圾值).我再也没有在程序中使用x ..这些是我想要错的东西......我想让它们保持原样.但是,当我执行第一段代码时,我得到157286.375011(垃圾值).

void main()
{
    int r = 6;
    float x = 8.2;
    printf ( "%f" ,  r/4);
}
Run Code Online (Sandbox Code Playgroud)

如果我执行上面的代码,我得到0.000000作为结果.我知道结果可能会出错,因为我在printf中使用%f时应该是%d ...结果可能是错误的...但我的问题是当我改变变量定义序列时结果会发生变化的原因.无论是对还是错,不应该是一样的吗?

为什么会这样?

Cod*_*ray 8

printf没有任何类型检查.它依赖于您自己进行检查,验证所有类型都与格式说明符匹配.

如果你这样做,你就进入了未定义行为的领域,任何事情都可能发生.该printf函数试图根据您使用的格式说明符来解释指定的值.如果他们不匹配,繁荣.

指定%f一个是无稽之谈int,但你已经知道......