Не вводить оператор if - PullRequest
       1

Не вводить оператор if

3 голосов
/ 01 апреля 2011

У меня проблема с просмотром оператора if, который должен вводить код в c:

void getInput(void)
    {
        static size_t _read = 0;
        memset(line, 0, _read);
        do{
            memset(line, 0, _read);
            write(STDOUT_FILENO, ">> ", 3);
            _read = read(STDIN_FILENO, line, MAXLINE - 1);
            if (line[0] == '\n' || line[0] == '\r')
                continue;
        }while(line[_read - 1] != '\n');
        line[_read] = '\0';
    }

Проблема в строке "if (line [0] == '\ n' || line [0] == '\ r') "здесь выписка из отладчика.

getInput () at main.c:29
29          if (line[0] == '\n' || line[0] == '\r')
1: line[0] = 10 '\n'
(gdb) step
31      }while(line[_read - 1] != '\n');
1: line[0] = 10 '\n'
(gdb) list 29
24      memset(line, 0, _read);
25      do{
26          memset(line, 0, _read);
27          write(STDOUT_FILENO, ">> ", 3);
28          _read = read(STDIN_FILENO, line, MAXLINE - 1);
29          if (line[0] == '\n' || line[0] == '\r')
30              continue;
31      }while(line[_read - 1] != '\n');
32      line[_read] = '\0';
33  }

Как вы можете видеть, он не идет к оператору continue, а скорее к оператору while,Я действительно думал, что continue будет переходить к оператору while, но я все еще не понимаю, почему он не наступает на продолжение first.

Спасибо

Ответы [ 4 ]

1 голос
/ 01 апреля 2011

Если вы компилируете с включенными оптимизациями, вполне возможно, что инструкция перехода для if просто идет прямо к while, а не к continue, что было бы просто еще одним простым переходом инструкция.

0 голосов
/ 01 апреля 2011

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

У рассматриваемой строки нет полного оператора;отладчик никогда не останавливается на середине оператора.

Представьте, что у вас есть многострочный оператор, как показано ниже.Где остановится отладчик?

for (
    i = 0;
    i < 100;
    i++)
            sum += a[i];
0 голосов
/ 01 апреля 2011

Ваш if избыточен. Это последняя вещь в цикле, и все, что он делает, это продолжает цикл. Если вы используете какую-либо оптимизацию, она может быть удалена.

Что должен делать ваш код?

0 голосов
/ 01 апреля 2011

Продолжение также приведет вас к оператору while.Возможно, это связано с оптимизацией компилятором.Он обнаружил, что после оператора continue нет операторов, и, следовательно, результирующий шаг будет таким же, независимо от того, оценивается ли условие if как истинное или нет.

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