Неясный условный синтаксис Java - PullRequest
5 голосов
/ 02 марта 2011

Мы только что обнаружили, коллега и я, странный синтаксис компиляции с условным синтаксисом Если :

if (true); {
  foo();
}

Есть ли кто-то здесь, чтобы объяснитьнам этот странный синтаксис?Thx.

Ответы [ 7 ]

8 голосов
/ 02 марта 2011

для меня это выглядит как оператор if с пустым телом, за которым следует блок кода, который всегда выполняется (и не связан с оператором if).Например, foo также выполняется здесь:

if (false); {
    foo();
}
6 голосов
/ 02 марта 2011

Первая часть, if (true); - это просто условное действие, которое заканчивается на ;.Остальное - это вызов foo() внутри нового блока области видимости.Вы должны найти, что foo() всегда вызывается.

4 голосов
/ 02 марта 2011

Это не имеет никакого реального смысла, но синтаксически правильно.Это также может быть записано как

if (true) 
{    
    // do nothing 
}
{   
    foo(); 
}

с {} вокруг foo ();ничего не значит в этом случае.Это ограничило бы область действия переменных, определенных в {}, если бы были определены переменные.

{
   int i=0;
   System.out.println(i);
}
{
   String i="hello";
   System.out.println(i);
}

работает просто отлично.

1 голос
/ 02 марта 2011

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

  1. Это опечатка, в этом случае ее следует исправить (когда вы узнаете, что должен делать код)
  2. Это намеренно неясный фрагмент кода, предназначенный для того, чтобы сбить читателя с толку, в этом случае его следует исправить (заменить на "foo ();"), а преступник должен быть найден и замечен
  3. Он был сгенерирован (плохим) автоматическим генератором исходного кода, и в этом случае его следует прокомментировать, чтобы указать, что
  4. Это осталось от сеанса отладки, и в этом случае его следует восстановить до того, что было до внесения изменения
1 голос
/ 02 марта 2011

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

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

1 голос
/ 02 марта 2011

я думаю, что это эквивалентно

if (true) {};
foo();

, поскольку if statemnt заканчивается после точки с запятой, а оператор foo только что помещен в блок ({}) ...

0 голосов
/ 02 марта 2011

Это мертвый код.Блок if бесполезен.

Эквивалент

if(doesn't matter whats here) {}
foo();
...