C 为什么不';我收到想要的2.50000…的输出吗。。。?
当我在第18行和第21行输入“printf(“%f\n”,5/2);”时,我没有得到2.5000。。。但是0.0000和65,我不明白为什么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
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