我在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作为输出.有人可以解释一下原因吗?
出现这种差异是因为编译器和库不会就类型进行通信.发生的事情是你的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).