Подтвердить что ты не робот

Java: for (;;) vs. while (true)

В чем разница между стандартным циклом while(true) и for(;;)?

Есть ли какой-либо файл или оба будут сопоставлены с одним и тем же байт-кодом после компиляции?

4b9b3361

Ответ 1

Семантически, они полностью эквивалентны. Это вопрос вкуса, но я думаю, что while(true) выглядит чище, и его легче читать и понимать на первый взгляд. В Java ни один из них не вызывает предупреждения компилятора.

На уровне байт-кода это может зависеть от компилятора и уровня оптимизации, но в принципе испускаемый код должен быть одним и тем же.

EDIT:

В моем компиляторе, используя плагин Bytecode Outline, байт-код для for(;;){} выглядит следующим образом:

   L0
    LINENUMBER 6 L0
   FRAME SAME
    GOTO L0

И байт-код для while(true){} выглядит следующим образом:

   L0
    LINENUMBER 6 L0
   FRAME SAME
    GOTO L0

Так что да, по крайней мере для меня, они одинаковы.

Ответ 2

Это вам, какой из них использовать. Потому что они равны компилятору.

создать файл:

// first test
public class Test {
    public static void main(String[] args) {
        while (true) {
            System.out.println("Hi");
        }
    }
}

компиляции:

javac -g:none Test.java
rename Test.class Test1.class

создать файл:

// second test
public class Test {
    public static void main(String[] args) {
        for (;;) {
            System.out.println("Hi");
        }
    }
}

компиляции:

javac -g:none Test.java
mv Test.class Test2.class

сравнить:

diff -s Test1.class Test2.class
Files Test1.class and Test2.class are identical

Ответ 3

В Oracle Java 7 вы получаете одинаковый код байта. Вы не можете указать из байтового кода, который использовался в оригинале. Лучше всего это вопрос вкуса. Я использую while(true)

Ответ 4

Он объединяется с одним и тем же байтовым кодом, и это вопрос вкуса, который вы предпочитаете.

Я прочитал много исходного кода из распределенного JDK Oracle, и я не могу с легкостью вспомнить, что я видел инструкцию while(true) в своем коде, но я видел в своем коде множество операторов for(;;), Я лично, я предпочитаю for(;;), и мои рассуждения немного похожи на это:

Цикл while должен содержать логическое выражение, а не логическую константу. while(true) немного похож на if(true), оба из которых, я думаю, стали законными только для дополнительного комфорта масс. Пустое while() не компилируется. Добавление true там немного похоже на взлом.

for(;;), с другой стороны, представляет собой "реальный цикл", хотя и пустой. Кроме того, это сэкономит вам пару нажатий клавиш! =) (не так уж и важно)

Поэтому, и я знаю, что это звучит безумно, но хотя (правда) лучше читается на английском языке, я думаю, что для (;;) лучше выразить свои намерения и более сродни языку программирования Java. В любом случае следует избегать вечных циклов. Когда я читаю (;;), я чувствую себя в безопасности, зная, что разработчик где-то тормозит путь исполнения. Когда я читаю (правда), я просто не могу быть уверенным. Но эй, может быть, только я! Мы все можем выбрать собственный вкус.

Ответ 5

В зависимости от компилятора он должен сопоставляться с одним и тем же байтовым кодом.

Ответ 6

JVM найдет лучший способ сделать байт-код и в обоих случаях должен сделать то же самое. Так что я думаю, что нет никакой разницы. while (true) просто красивее.

Ответ 7

Функционально нет разницы. Любая эффективность, полученная или потерянная разницей в байт-коде, вероятно, будет незначительной по сравнению с любой инструкцией, которую вы выполняете в теле цикла.

Ответ 8

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