Объявленная, но неустановленная переменная оценивается как true? - PullRequest
3 голосов
/ 22 сентября 2011

Я делал простой калькулятор со следующим кодом.Прямо сейчас это выполняется отлично.Однако когда я пытался что-то изменить, это не сработало.Я использовал 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 ]

7 голосов
/ 22 сентября 2011

Вы не установили начальное значение program, поэтому по умолчанию используется значение мусора, которое просто бывает ненулевым.

Установите начальное значение program при его объявлении:

BOOL program = NO; // or YES, whichever is appropriate
2 голосов
/ 22 сентября 2011

Хорошей практикой всегда является инициализация всех ваших переменных при их объявлении.

Также использование scanf для ввода может привести к переутомлению, если бы я был вами, я бы использовал fgets, а затем извлекал информацию из строки, используя strtok. Таким образом, даже если пользователь положит свой локоть на клавиатуру, вам не придется беспокоиться. В качестве альтернативы, если вам нравится scanf, используйте sscanf для этой строки вместо strtok.

...