【发布时间】:2019-12-30 15:43:30
【问题描述】:
我正在尝试运行以下代码来演示转换的工作原理。
#include <stdio.h>
int main()
{
int x=5;
int y=2;
float z;
printf("x=%d\n", x);
printf("y=%d\n", y);
//Doing division as it is
z= x/y;
printf("With no preliminar assignment: (z=x/y)\n");
printf("\"z\" is: %d (integer) or %lf (double) or %f(float)\n\n\n", z, z, z);
//Doing assignment before division
printf("With the assignment: (z=x)\n");
z=x;
printf("\"z\" before division is:");
printf("%d (integer) or %lf (double) or %f(float)\n", z, z, z);
//Doing division after assignment
z/=y;
printf("\"z\" after division with assignment: (z=z/y)");
printf(" is: %d (integer) or %lf (double) or %f(float)\n", z, z, z);
return 0;
}
输出是:
x=5
y=2
With no preliminar assignment: (z=x/y)
"z" is: 0 (integer) or 0.000000 (double) or 0.000000(float)
With the assignment: (z=x)
"z" before division is:0 (integer) or 0.000000 (double) or 0.000000(float)
"z" after division with assignment: (z=z/y) is: 0 (integer) or 0.000000 (double) or 0.000000(float)
这让我产生了疑问,也是因为我在大学的教授写了以下代码:
int x=5;
int y=2;
float z;
int main (void) {
z = x / y;
return 0;
}
对他来说,z 将假定为 2.0(这在逻辑上是正确的,但在 printf 中不正确)。
所以我的最后一个问题是,为什么所有 printf 的结果都是 0? (我不想使用类型转换运算符)
【问题讨论】:
-
参数类型必须与格式字符串匹配。如果他们没有,你必须投。否则它将是未定义的行为。
-
第 12 行怎么会给出 0.000000 作为双重结果?请提供正确的输出
-
我不修改 OUTPUT,自己尝试一下,你会得到我的结果 @kalpajagrawalla。所以我的问题仍然存在。
-
不,我们没有得到您的结果。对于“没有初步分配”,我得到“z”是:73896(整数)或 2.000000(双精度)或 2.000000(浮点数)”。有一条规则是参数的 type 必须匹配 conversion specifier 才能定义行为。当您为转换规范
%d传递float参数 (z) 时,您就违反了此规则。最后,这弄乱了将参数传递给printf的工作方式。这意味着printf得到了错误的数据。它在不同的实现上表现不同。这意味着打印的内容并未向您显示z中的内容。 -
正确:“最后”应该是“至少”。
标签: c casting type-conversion printf