我的输出应该是:
ch = *
f = 200
ch = /
f = 0.50
但由于某种原因,每次运行程序时“/”的情况都是一个随机数。 1639747584和下一个我得到206200832,这是为什么?它也是我使用'float'而不是'int'的程序的唯一部分。
我的代码:
#include <stdio.h>
#include <float.h>
void main() {
char ch;
int f;
int a = 10, b = 20;
ch = '*';
printf("ch = %c\n", ch);
switch (ch) {
case '*': f = a * b; printf("f = %d\n", f);
break;
case '/': f = a / b; printf("f = %d\n", f);
default: printf("invalid operator\n");
}
ch = '/';
printf("ch = %c\n", ch);
(float) f;
switch (ch) {
case '*': f = a * b; printf("f = %d\n", f);
case '/': f = a / b; printf("f = %d\n", f);
break;
default: printf("invalid operator\n");
}
}
好吧,我用一个新变量替换了'(float)f'行,更改了print命令,并将(a / b)转换为'float',但现在我只得到0.00作为结果。还有什么不对?
更新的代码:
ch = '/';
printf("ch = %c\n", ch);
float g;
switch (ch) {
case '*': f = a * b; printf("f = %d\n", f);
case '/': g = (float)(a / b); printf("f = %.2f\n", g);
break;
default: printf("invalid operator\n");
}
答案 0 :(得分:0)
int a = 10, b = 20;
float g = (float)(a / b); // problem code
执行a/b
的整数除法。结果是int
。将该商投射到(float)
不能恢复作为整数除法的一部分而丢弃的分数。确保参数在分割之前是浮点数。
float g = (float) a / b;
// or better
// in general, better to avoid casts to accomplish coding goals.
float g = 1.0 * a / b;
// or
float g = a;
g /= b;
(float) f;
这行代码无效。它是int
变量f
到float
值的强制转换。该转换的结果被丢弃,代码行可能被优化,导致没有发出与之相关的可执行代码。
要在单个对象中保存不同类型的数据,请使用union
并跟踪上次用于向其保存数据的字段。
struct universal {
char kind;
union {
int i;
float f;
} u;
} y;
switch (ch) {
case '*':
y.kind = 'i';
y.u.i = a * b;
break;
case '/':
y.kind = 'f';
y.u.f = (float) a / b;
break;
default:
y.kind = 0;
}
switch (y.kind) {
case 'f' : printf("y = %f\n", y.u.f); break; //or "%.2f" for only 2 places to right of .
case 'i' : printf("y = %d\n", y.u.d); break;
default : printf("y = ?\n"
}