@Rohanshetty67

Альтернативы и операторы goto в C?

Приведенная ниже программа предназначена для поиска первой строки, состоящей из нулей, матрицы n n , если таковая существует. Является ли это правильным решением проблемы, и есть ли другой подходящий структурированный способ для этого кода на C или на любом другом языке? Я пытаюсь узнать больше об операторах goto и их допустимых вариантах использования/альтернативах. Любая помощь очень ценится!
int first_zero_row = -1; /* none */
int i, j;
for (i = 0; i < n; i++) {
    for (j = 0; j < n; j++) {
        if (A[i][j]) goto next;
    }
    first_zero_row = i;
    break;
    next: ;
}

Это одна из приведенных в этой статье scaler topics по этому вопросу, чтобы выйти из нескольких петель сразу. Создайте функцию для каждого внутреннего цикла. Причина, по которой это работает, заключается в том, что оператор return действует как переход к концу функции.
  • Вопрос задан
  • 170 просмотров
Решения вопроса 1
@mayton2019
Bigdata Engineer
Давайте не будем рефакторить этот код а создадим новую функцию. Которая делает тоже самое и докажем что полученый код эквивалентен. Тогда и проблема goto будет иметь еще одно решение. Наша функция предположительно будет такая:

int find_first_zero_row(int **matrix, int cols, int rows) {
   .....
   return -1;
}


Будет такой контракт что если строка из нулей найдена то мы получаем ее номер или -1 в противном случае.

Нам может понадобиться вспомогательная функция.

int all_items_are_zero(int *items, int length) {
   ....
}


Мне кажется что с таким набором нам не понадобится goto. Декомпозиция кода на функции - это один из способов избежать goto.

P.S. Не бойтесь вводить в код функции. Торвальдс не запрещает функции в языке С. Ценнее код который работает правильно а не тот который выглядит как колбаса и глючит временами.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Adamos
@Adamos
Пример неудачный, здесь goto не нужен вообще.
Достаточно заменить его на break и обернуть те два оператора, которые он перепрыгивает, в проверку j == n.
Ответ написан
CityCat4
@CityCat4
Жил-был у бабушки серенький троллик...
За 20+ лет программирования на С ни разу при такой задаче не сталкивался с необходимостью использования goto. Операторы цикла в С настолько мощные, что запросто чуть подумав можно придумать, как от него отказаться. Вчитываться в код лень.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы