声明但未设置的变量评估为真?

时间:2011-09-22 17:06:22

标签: objective-c variable-assignment conditional-statements boolean

我正在使用以下代码做一个简单的计算器。现在它完美地执行。然而,当我试图改变一切时,它不起作用。我使用BOOL program检查是否继续要求此人输入或完成程序。

如果我将while语句的表达式更改为(program)并更改YES语句中的NO / program,为什么代码无效做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;
}

2 个答案:

答案 0 :(得分:7)

您尚未设置program的初始值,因此默认为垃圾值发生为非零。

声明时设置program的初始值:

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

答案 1 :(得分:2)

在声明它们时初始化所有变量始终是一个好习惯。

同样使用scanf输入可能会过度,如果我是你,我会使用fgets,然后使用strtok从字符串中提取信息。这样,即使用户将肘部放在键盘上,您也不必担心。或者,如果您喜欢scanf,请在该字符串上使用sscanf而不是strtok。