当我输入“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
答案 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)
如果转换规范无效,则行为未定义.282)如果任何参数不是相应转换规范的正确类型,则行为未定义。
表达式5/2
将结果作为整数2
,这是您在%f
中使用的转化规范printf()
的错误类型,并导致未定义的行为。
为了获得所需的输出(即2.500000),您可以使用float
中的printf()
对表达式进行类型转换:
printf("%f\n", (float)5 / 2); // Output: 2.500000
作为替代方案,您可以将5/2
与1.0
相乘以获得所需的结果,如下所示:
printf("%f\n", 1.0 * 5 / 2); // Output: 2.500000
警告:在此处,请确保multiplication
1.0
的表达式应该5 / 2
之前,multiplication
和{{} 1}}具有相同的优先级和从左到右的关联性。结果与division
中5 / 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参数的类型正确匹配,否则将发生未定义的行为。