为什么我没有收到想要的2.50000输出......?

时间:2017-11-08 13:08:17

标签: c input output

当我输入“printf(”%f \ n“,5/2)行时,”在第18行和第21行我没有得到2.5000 ......但是0.0000和65我不明白为什么。

int main(void){int a = 65;
char c = (char)a;
int m = 3.0/2;
printf("%f\n", 5 / 2);
printf("%c\n", c);              // output: A
printf("%f\n", (float)a);       // output: 65.000000
printf("%f\n", 5 / 2);
printf("%f\n", 5.0 / 2);        // output: 2.5000000
printf("%f\n", 5 / 2.0);        // output: 2.5000000
printf("%f\n", (float)5 / 2);   // output: 2.5000000
printf("%f\n", 5 / (float)2);   // output: 2.5000000
printf("%f\n", (float)(5 / 2)); // output: 2.0000000 - we cast only after division and result was 2
printf("%f\n", 5.0 / 2);        // output: 2.5000000
printf("%d\n", m);              // output: 1
system("PAUSE");
return 0; }

输出是:

0.000000
A
65.000000                                                                   
65.000000
2.500000
2.500000
2.500000
2.500000
2.000000
2.500000
1

3 个答案:

答案 0 :(得分:3)

您无法使用%f格式化整数。这样做会调用未定义的行为。表达式5 / 2等于整数2。您必须使用整数格式,例如%d,否则将其强制转换为double以使用%f。所以改变:

printf("%f\n", 5 / 2);

要么:

printf("%d\n", 5 / 2);

或:

printf("%f\n", (double) (5 / 2));

答案 1 :(得分:1)

来自C Standard#7.21.6.1p9

  

如果转换规范无效,则行为未定义.282)如果任何参数不是相应转换规范的正确类型,则行为未定义。

表达式5/2将结果作为整数2,这是您在%f中使用的转化规范printf()的错误类型,并导致未定义的行为

为了获得所需的输出(即2.500000),您可以使用float中的printf()对表达式进行类型转换:

printf("%f\n", (float)5 / 2); // Output: 2.500000

作为替代方案,您可以将5/21.0相乘以获得所需的结果,如下所示:

printf("%f\n", 1.0 * 5 / 2); // Output: 2.500000

警告:在此处,请确保multiplication 1.0的表达式应该5 / 2之前,multiplication和{{} 1}}具有相同的优先级和从左到右的关联性。结果与division5 / 2 * 1.0表达式的期望结果不同。

答案 2 :(得分:0)

问题是,printf参数列表中的参数必须与格式字符串中指定的类型匹配。这里

printf("%f\n", (float)a);       // output: 65.000000

你得到了你期望的输出,但是在这里:

printf("%f\n", 5 / 2);

你不会得到2(整数除法的预期结果),但也是 65.00000,因为printf()"看错了地方"对于该值(即一些浮点寄存器,其中整数除法的结果未定位,但是来自printf的旧值在徘徊之前)。

因此,您始终必须确保格式字符串和printf参数的类型正确匹配,否则将发生未定义的行为。