2014-09-10 2 views
1

Тело в то время как (или любые другие из циклов Java) могут быть пустыми. Это связано с тем, что нулевой оператор (тот, который состоит только из точки с запятой) синтаксически действителен в Java. Теперь рассмотрим это:Хотя цикл без тела в Java

i = 100  

j = 200 

while(++i < --j); // no body in this loop 

    system.out.println(i);   

    system.out.println(j);  

Я заметил, что если значение I меньше, чем у, то цикл повторяется, и когда условие не выполнить, то только 2 ниже утверждения exceuted. Правильно ли я, или есть ли другая логика?

+0

Да, ваше понимание верное. Также '++' будет убедиться, что 'i' станет = или>' j' в какой-то момент. – Nivas

+0

Вы верны – ControlAltDel

+1

@Aeshang Это неверно. Цикл будет «работать» до тех пор, пока условие не будет выполнено. – Nivas

ответ

7

Да, он продолжает повторяться без выполнения каких-либо других утверждений.

Он проверит условия 101 < 199, 102 < 198 и так далее, пока не проверит 150 < 150. Затем он выходит из цикла и выполняет операторы println.

Выход:

150 
150 

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

2

Да. Булево выражение будет оцениваться на каждой итерации, и когда оно приведет к ошибке, цикл завершится. Кроме того, это System.out.println не system.out.println.

0

Вы верны. Цикл будет выполнять тело цикла (нет тела цикла) до тех пор, пока не будет выполнено условие while, после чего он вырвется из цикла и последовательно выполнит следующие 2 оператора.

7

Ответы уже приведены правильно.

Однако я хочу указать, что это не так, что в цикле нет тела. Вы должны это рассмотреть после компиляции. Это становится:

  1. Initialize я при 100
  2. Initialize J при 200
  3. Приращение я
  4. Декремент J
  5. Если нет (я < J), перейти к 7
  6. Перейти к 3
  7. Печатание и прочее

Петля в этом случае составляет от 3 до 6 и имеет корпус (приращение i декремент j) и проверку состояния в точке 5.

Чтобы сделать его более ясным, я напишу еще один цикл, функционально идентичный, но с a body:

while (true) { 
    i++; 
    j--; 
    if (!(i<j)) break; 
} 

Теперь этот цикл имеет тело, но, вероятно, скомпилированная версия этого цикла и предыдущего идентичны.

Однако мы могли бы обозначить «Пустое тело» петлю, которая не имеет побочных эффектов.Например, этот цикл:

for (int i = 0; i < 10000; i++); 

Этот цикл является «действительно» пустым: не имеет значения, если вы выполняете его или нет, это не дает или взять что-нибудь от остальной части программы (если не задержка) ,

Таким образом, мы могли бы определить его «без какого-либо значения» больше, чем «пустое от любого тела».

В этом случае JIT заметит это и уничтожит его.

В этом смысле, ваш цикл может быть:

for (int i = 100, j = 200; i < j; i++, j--); 

Здесь, так как «я» и «J» объявляется «внутри» цикл (не существует вне его сферы применения), то этот цикл не имеет смысла и будет уничтожена.

Возможно, это то, что означает Герберт Шильдт (что я допускаю, что не знаю)?

Также см. Здесь Java: how much time does an empty loop use? о пустых петлях и JIT.

+0

Герберт Шильдт пишет, что это петля без тела. Я не думаю, что он ошибается. –

+0

Ваш исходный пост, оставшийся без номера 3. StackOverflow перенумеровал его для вас, поэтому «номера строк» ​​теперь ошибочны. – ajb

+4

Я не знаю, кто такой Герберт, но Симона Джанни объясняет, как выглядит этот код Java на низком уровне языка, и это правильно. Это то, что «продолжается» во время выписки – Chronicle

Смежные вопросы