我的输出应该是:
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”行,更改了打印命令,并将 (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");
}
最佳答案
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"
}
关于C 'float' 生成随机答案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42183393/