2017-02-12 67 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" 
}