Xcode "бесконечный цикл" несоответствие - PullRequest
2 голосов
/ 06 февраля 2010

При запуске этого кода в режиме отладки в симуляторе iPhone он корректно завершается с r == 4 после 5 итераций цикла: -

int r;
for (r = 0;;r++)
{
    if (r == 4)
        break;
}

Без фигурных скобок он завершается с r == 1 после 1 итерации: -

int r;
for (r = 0;;r++)
    if (r == 4)
        break;

Без фигурных скобок, но с тестовым выражением, которое является истинным, вместо постоянно истинного значения по умолчанию для отсутствующего тестового выражения, оно корректно завершается с r == 4 после 5 итераций цикла: -

int r;
for (r = 0; r > -100;r++)
    if (r == 4)
        break;

Я что-то здесь упустил или это второй пример ошибки компилятора?

Ответы [ 4 ]

2 голосов
/ 06 февраля 2010

Я не знаю, следует ли рассматривать ваш вопрос как дубликат, но, возможно, это ответ:

По-разному ли обрабатываются циклы с круглой скобкой и без нее в C?

Отладчик выполняет один оператор за раз.

Я немного ошибся в своем предыдущем ответе. Конечно, отладчик также выполняет цикл 4 раза. Разница в том, что он выглядит как будто он выходит после одной итерации. Когда я отлаживаю следующий код:

#include <stdio.h>

int main (int argc, const char * argv[]) {
    int r;
    for (r = 0;;r++)
        if (r == 4)
            break;

    printf("%i",r);
    return 0;
}

отладчик обрабатывает строку for, затем строку if, строку for и затем выделяет строку printf. Таким образом, похоже, что printf будет выполнено, но на следующем шаге отладчик снова выделит строку if, затем перейдет к for, увеличив, таким образом, r, а затем снова выделив printf.

Это код, который я пробовал в XCode, и он в основном такой же, как описано выше (я только что добавил несколько строк кода в main.m в новом проекте приложения Cocoa):

#import <Cocoa/Cocoa.h>

int main(int argc, char *argv[])
{
    int r;
    for (r = 0;;r++)
        if (r == 4)
            break;
    return NSApplicationMain(argc,  (const char **) argv);
}

Изображение с применением какао:

Отладчик http://img691.imageshack.us/img691/3844/1002060002.png

Итак, вопрос в том, действительно ли вы щелкали по циклу шаг за шагом и действительно ли цикл завершается после одной итерации, или вы просто остановились после одной итерации?

2 голосов
/ 06 февраля 2010

У меня нет под рукой симулятора, но если это действительно так, то да, что-то идет не так. Ваш первый и второй пример идентичны в том, что касается языка. Вы уверены, что ваши тесты точны? Что код, который вы показываете нам выше, это именно то, что вы запускаете в симуляторе?

Редактировать: ОК, я попробовал, и он работает правильно в симуляторе здесь. Мое лучшее предположение для решения вашей проблемы заключается в том, что у вас есть:

for (r = 0;r++;)

Случайно в случае, если вы думаете, что не удается. Обратите внимание, что оператор пустого цикла перенесен из того, что вы написали выше. Этот цикл for даст вам результат 1.

Редактировать 2: Прочитав некоторые другие ответы здесь, я подумал, что мне следует проверить отладчик. Посмотрите на этот скриншот! изображение http://img38.imageshack.us/img38/7128/xcodeh.png

Если я снова нажму «шаг за шагом», то все равно вернется в цикл; просто маленький графический сбой.

0 голосов
/ 28 августа 2011

Это не ошибка. Это просто в основном синтаксис Си. Без скобок цикл for / while или условие if рассматриваются только через одну строку после объявления, то, что вы найдете в следующей строке, больше не принадлежит циклу / условию. В противном случае, имея квадратные скобки, вы на самом деле определяете в виде строк, как вы, что внутри вашей итерации. Надеюсь, это поможет.

0 голосов
/ 06 февраля 2010

Похоже, ошибка компилятора для меня. Какой компилятор вы установили, gcc или llvm-gcc?

Я только что проверил это с gcc 4.2.1 (Apple Inc., сборка 5646) и получил правильный результат в обоих случаях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...