2011-09-22 10 views
3

私は次のコードを使って簡単な電卓を作っていました。今は完全に実行されます。しかし、私は物事を変えようとしたときにうまくいかない。私はBOOL programを使って人からの入力を求め続けるか、プログラムを終了するかを確認しました。宣言されているが未設定の変数はtrueと評価されますか?

私はちょうど(program)while文の表現を変更し、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のみがfalseとみなされるため)と評価されると想定するのは安全でしょうか? – 5StringRyan

+2

絶対にありません。その値は未定義です。それは毎回ランダムな値に評価される可能性があります。親指のルール:***常にCであなたの変数を初期化*** –

+1

(私は自分のコードでそうであるように)私は完全に初期化時にあなたに同意します。私は、「未定義」の値が常にランダムで、無作為に何回0が選ばれるかについて考えていました。 0以外のもの(初期化なしでbool変数にランダムに割り当てられる可能性があります)は、評価中に「FALSE」を返しますか? – 5StringRyan

2

常にあなたがそれらを宣言するときに、すべての変数を初期化することをお勧めします。

また、入力のためにscanfを使用すると、あまりにも多すぎるかもしれません。もし私があなただったら、fgetsを使用し、strtokを使用して文字列から情報を抽出します。そうすれば、ユーザーがキーボードに肘を当てても心配する必要はありません。あるいは、scanfが好きな人は、strtokの代わりにその文字列にsscanfを使用してください。

関連する問題