Рисование графа программы. Какую строку посещают после того, как условие или цикл не вызваны?
Просто хотел проверить, правильно ли я думаю. Вот пример метода:
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
Как вы можете видеть, закрывающая скобка не переводится, поэтому она не существует. Он сигнализирует об окончании блока, но не является частью исполнения.