2011-09-22 3 views
3

Je faisais une simple calculatrice avec le code suivant. En ce moment, il s'exécute parfaitement. Quand j'ai essayé de changer les choses, cependant, cela ne fonctionne pas. J'ai utilisé BOOL program pour vérifier si continuer à demander la contribution de la personne ou terminer le programme.La variable déclarée mais non définie est vraie?

Si je change l'expression de while déclaration juste (program) et changer YES/NO dans les program déclarations, pourquoi le code ne parviennent pas à faire ce qui est à l'intérieur du 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; 
} 

Répondre

7

Vous avez pas encore défini la valeur initiale de program, donc la valeur par défaut une valeur d'ordures qui vient arrive être non nulle.

Définir la valeur initiale de program lorsque vous déclarez:

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

S'il s'agit toujours de déchets (non nul), est-il sûr de supposer que 99,99% du temps sera évalué à Vrai (puisque seulement 0 est considéré comme faux)? – 5StringRyan

+2

Absolument pas. Sa valeur est indéfinie. Il pourrait évaluer à une valeur aléatoire chaque fois. Règle de base: *** TOUJOURS INITIALISER VARIABLES EN C. *** –

+1

Je suis entièrement d'accord avec vous sur l'initialisation (comme je le fais dans mon propre code). Je pensais juste à la façon dont une valeur "indéfinie" est toujours aléatoire et combien de fois 0 serait choisi au hasard. Est-ce que n'importe quoi d'autre que 0 (qui pourrait être assigné au hasard à la variable de bool sans initialisation) donne un "FAUX" pendant une évaluation? – 5StringRyan

2

Il est toujours une bonne pratique pour initialiser toutes vos variables lorsque vous les déclarez.

L'utilisation de scanf pour l'entrée peut être exagérée, si j'étais vous, j'utiliserais fgets, puis extraire les informations de la chaîne en utilisant strtok. De cette façon, même si l'utilisateur met son coude sur le clavier, vous n'aurez pas à vous inquiéter. Alternativement, si vous aimez scanf, utilisez sscanf sur cette chaîne au lieu de strtok.

Questions connexes