Рисование графа программы. Какую строку посещают после того, как условие или цикл не вызваны?

Просто хотел проверить, правильно ли я думаю. Вот пример метода:

1 public static boolean isCircle (int M, int m) {
2     boolean result = false;
3     if (M == m & M > 0 & m > 0) {
4         result = true;
5     }
6     return result;
7     }

Если бы я должен был нарисовать программный график этого метода (каждая линия - узел, а их путь - ребра) с переменными, которые не удовлетворяют условию, например, M = 1, m = 0. Будет ли программа идти от строки 3 -> строка 6 или из строки 3 -> строка 5 (конец условного). Я думаю, что строка 3 - строка 6, но я не уверен.

2 ответа

Это зависит. Большинство отладчиков в IDE помещают маркер выполнения в начало строки, которую он собирается выполнить. После выполнения условия в строке 3, которое оценивается как falseследующая значимая строка для выполнения - строка 6.

Однако рассмотрим этот код:

1 public static boolean isCircle (int M, int m) {
2     boolean result = false;
3     if (M == m & M > 0 & m > 0) {
4         result = true;
5     } else printf("false!");
6     return result;
7 }

Если выполнение подпрыгнет до 6, это будет означать, что printf был выполнен как часть условного, что было бы неприятно для отладки.

Вы можете проверить это поведение с помощью отладчика в любой IDE. Вы можете найти одну или две IDE, которые помещают выполнение в начало следующего оператора (строка 6), но в случае, когда есть что-то еще для выполнения в строке 5, кроме }Я надеюсь, что это приостановит выполнение, прежде чем перепрыгнуть через эту линию.

Любой отладчик, достойный своей соли, будет игнорировать строки, которые не имеют никакого значения (пробелы, комментарии, открывающие / закрывающие скобки), но делают паузу в начале каждой значащей строки, чтобы вы могли оценить переменные, установить новые точки останова и т. Д.

Было бы перейти к 6, так как это следующая инструкция.

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

Смотрите этот пост для байт-кода, который мог бы прояснить. http://blog.jamesdbloom.com/JavaCodeToByteCode_PartOne.html

Как вы можете видеть, закрывающая скобка не переводится, поэтому она не существует. Он сигнализирует об окончании блока, но не является частью исполнения.

Другие вопросы по тегам