2011-09-22 65 views
3

我正在用下面的代碼做一個簡單的計算器。現在它執行完美。然而,當我嘗試改變事物時,它不起作用。我使用BOOL program來檢查是否繼續詢問該人員的輸入或完成該程序。聲明但未設置的變量評估爲真?

如果我改變while語句的表達只是(program)並更改program聲明YES/NO,爲什麼代碼不能做什麼while裏面?

// A simple printing calculator 
{ 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init] 
    Calculator *deskCalc = [[Calculator alloc] init]; 
    double value1; 
    char operator   
    BOOL program; 

    [deskCalc setAccumulator: 0]; 

    while (!program) { 
    NSLog (@"Please type in your expression"); 
    scanf (" %lf %c", &value1, &operator); 
    program = NO; 

     if (operator == '+') { 
      [deskCalc add: value1]; 
     } 
     else if (operator == '-') { 
      [deskCalc subtract: value1]; 
     } 
     else if (operator == '*' || operator == 'x') { 
      [deskCalc multiply: value1]; 
     } 
     else if (operator == '/') { 
      if (value1 == 0) 
       NSLog (@"Division by zero!"); 
      else 
       [deskCalc divide: value1]; 
     } 
     else if (operator == 'S') { 
      [deskCalc set: value1]; 
     } 
     else if (operator == 'E') { 
      [deskCalc accumulator]; 
      program = YES; 
     } 
     else { 
      NSLog (@"Unknown operator"); 
     } 
    } 

    NSLog (@"The result is %f", [deskCalc accumulator]); 

    [deskCalc release]; 

    [pool drain]; 
    return 0; 
} 

回答

7

您沒有設置program初始值,所以它默認爲剛剛發生爲非零垃圾值。

在聲明它設置的program初始值:

BOOL program = NO; // or YES, whichever is appropriate 
+0

如果它總是垃圾(不爲零),是安全的假設的99.99%的時間爲True(因爲只有0被認爲是假的),它會評價? – 5StringRyan

+2

絕對不是。它的值是未定義的。它可以每次評估爲隨機值。經驗法則:***總是初始化你的變量在C。*** –

+1

我完全同意你的初始化(就像我在自己的代碼中那樣)。我只是在考慮一個「未定義」值總是隨機的,隨機選擇多少次0。除了0以外的任何東西(可以隨機分配給bool變量而不進行初始化)在評估過程中會給出「FALSE」嗎? – 5StringRyan

2

它始終是一個很好的做法,當你聲明它們初始化所有變量。

而且使用scanf函數輸入可能矯枉過正,如果我是你,我會用fgets,然後提取使用strtok的字符串的信息。這樣,即使用戶將他的手肘放在鍵盤上,您也不必擔心。或者,如果您喜歡scanf,則使用sscanf而不是strtok。