C的格式说明符

时间:2015-09-14 13:23:08

标签: c int

我在C -

中有这段代码
#include <stdio.h>
void main(void)
{
    int a=90;
    float b=4;
    printf("%f",90%4);
}

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

6 个答案:

答案 0 :(得分:5)

90%4的类型将为int

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

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

答案 1 :(得分: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);
  ^

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

答案 2 :(得分:2)

<div class="block"> <div class="block-inner"> <div class="box"> <h1>Title</h1> <p> Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. </p> <p> Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. </p> <a href="#">A link</a> <p> Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. </p> </div> </div> </div>期待%f,并在double中传递int(90%4=2)。因此,导致 Undefined Behaiour 并且可以输出任何内容。

您需要明确强制转换 -

printf

不要尝试这个,因为编译器会产生错误(正如@chux Sir所指出的那样) -

printf("%f",(double)(90%4));   

答案 3 :(得分:2)

printf是一个可变函数。这些功能模糊不清,没有值得一提的类型安全性。这样的函数做的是隐式地促使小整数类型输入intfloatdouble,但就是这样。它无法做更多微妙的事情,如整数到浮动转换。

因此printf本身无法分辨你传递给它的东西,它依赖于程序员来指定正确的类型。 90等整数文字的类型为int。使用%f说明符,您告诉printf您传递了double,但实际上传递了int,因此您调用了未定义的行为。意味着任何事情都可能发生:不正确的打印,正确的打印,程序崩溃等。

明确的演员(double)(90%4)将解决问题。

答案 4 :(得分:1)

简而言之:格式说明符没有错误检查。如果你的格式正在寻找一个double,那么你作为一个参数传递的任何东西(或者即使你没有传递任何东西)也会被解释为double。

答案 5 :(得分:-1)

默认情况下,90%4给出一个整数。 如果使用%f说明符打印整数,则将打印0。

例如,printf("%f", 2);将打印0。

使用float进行类型转换结果,您将获得2.00000。

printf("%f",(float) (90%4));将打印2.00000

希望它澄清。