C 为什么不';我收到想要的2.50000…的输出吗。。。?

C 为什么不';我收到想要的2.50000…的输出吗。。。?,c,input,output,C,Input,Output,当我在第18行和第21行输入“printf(“%f\n”,5/2);”时,我没有得到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.00000

当我在第18行和第21行输入“printf(“%f\n”,5/2);”时,我没有得到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

不能使用
%f
格式化整数。这样做会调用未定义的行为。表达式
5/2
等于整数
2
。您必须使用整数格式,如
%d
,或者将其强制转换为
双精度
,以使用
%f
。因此,改变:

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

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


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

printf("%f\n", (float)a);       // output: 65.000000
您得到了预期的输出,但这里:

printf("%f\n", 5 / 2);
您不会得到
2
(整数除法的预期结果),但也会得到
65.00000
,因为
printf()
“在错误的位置查找”该值(即某些浮点寄存器,整数除法的结果不在其中,但printf之前的旧值仍然存在)

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

From

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

表达式
5/2
将结果表示为整数
2
,这对于您在
printf()
中使用的转换规范
%f
是不正确的类型,并导致未定义的行为

为了获得所需的输出(即2.500000),您可以在
printf()
中使用
float
键入表达式:

或者,您可以将
5/2
1.0
相乘,以获得所需的结果,如下所示:

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

注意:此处,确保表达式中的
乘法
1.0
应位于
5/2
之前,因为
乘法
除法
具有相同的优先级和从左到右的关联性。结果将不同于
printf()

5/2*1.0
表达式的预期结果,哪一个是第18行?
%f
请求
double
5/2
的结果是
int
2
)。如果给出的参数类型与请求类型不同,则结果未定义。可能存在匹配的重复项,但应该与核心问题有关(使用错误的printf格式说明符)。可能重复@purplepsycho no,这不是一个合适的副本——这里的核心问题不是整数除法,而是使用了错误的printf格式说明符。。。。否则(如在原始代码中)将是未定义的行为,顺便说一句,将打印什么取决于具体的实现。@FelixPalmen是的,如果使用不兼容的格式,您无法预测它将做什么。这只是为了可能改进您的正确(和uv)答案,以防OP有兴趣“解释”他输出的
0.0
:)@FelixPalmen啊,好的,我加了一条评论。可能是吹毛求疵,但不是从左到右执行,而是从左到右关联。
printf("%f\n", (float)5 / 2); // Output: 2.500000
printf("%f\n", 1.0 * 5 / 2); // Output: 2.500000