2017-02-12 79 views
-2

我的输出应该是:C“浮动”生成随机答案

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"); 
    } 
} 

好的,我取代了 '(浮点)F' 与一个新的变量线,改变了打印命令,和铸造(A/B),以 '浮动',但现在结果我只得到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

所以你期望'int f'是'0.5'? –

+1

你想用'(float)f'来做什么? –

+0

一旦定义了'f',你就不能改变它的类型。你可能想要为'/'声明另一个浮点数变量,并且在分割之前将'a/b'转换为浮点数,因为'C'中的'1/2 = 0'也会将输出更改为'printf( “f =%f \ n”,float_f)'。 –

回答

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变量ffloat的值。该转换的结果被丢弃,并且该代码行可能被优化,导致没有关于它的发出的可执行代码。


要保存不同类型的数据在一个单一的对象,使用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" 
}