C的格式说明符

Viv*_*mar -4 c int

我在C-中有这个代码

#include <stdio.h>
void main(void)
{
    int a=90;
    float b=4;
    printf("%f",90%4);
}
Run Code Online (Sandbox Code Playgroud)

它输出0.0000,我无法理解为什么??? 我知道90%4返回2并且指定的格式说明符是%f,这是双倍的,但我期望的是 - 它会给出一个错误,但它显示0.0000作为输出.有人可以解释一下原因吗?

Bat*_*eba 6

90%4 的类型将是int.

使用%f作为a的格式说明符的行为int是未定义的.

输出可能是2,它可能是0.编译器甚至可以吃你的猫.


Yan*_*ier 5

出现这种差异是因为编译器和库不会就类型进行通信.发生的事情是你的C编译器观察到printf是一个带有任意数量参数的可变参数函数,因此额外的参数会按照它们各自的类型传递.如果你很幸运,它还会解析格式字符串并警告你类型不匹配:

$ gcc -Wformat -o fmterr fmterr.c
fmterr.c: In function ‘main’:
fmterr.c:6:2: warning: format ‘%f’ expects argument of type ‘double’, 
but argument 2 has type ‘int’ [-Wformat=]
  printf("%f",90%4);
  ^
Run Code Online (Sandbox Code Playgroud)

但这仍然是一个警告; 就编译器而言,您可能已将printf替换为具有不同行为的函数.在运行时,浮点和整数参数可能甚至不能放在同一个地方,并且当然不具有相同的格式,因此不保证0.0的特定结果.真正发生的事情可能与平台ABI有关.您可以通过将printf参数更改为类似的方式来获取指定的行为(float)(90%4).