Не используется оператор if в Java - PullRequest
5 голосов
/ 31 октября 2011

Это очень странный и довольно специфический вопрос.

В конечном итоге я пытаюсь написать программу конвертирования, которая использует исходный код Java и преобразует его так, чтобы он не использовал (помимо прочего)

  • Массивы
  • Loops
  • Пользовательские методы
  • Если заявления

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

У меня большинство из них проработано, включая встраивание функций и подстановку массивов, однако я не могу понять, как управлять оператором if.

В C ++ я бы использовал метки и переходы и, возможно, ?:, однако Java не поддерживает операторы GOTO.

Мой вопрос такой: Учитывая часть кода,

if(CONDITION)
{
   //More code in here
}

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

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

Edit: Обратите внимание, что переключение также не допускается, как и рекурсия (исключено тем, что вы не можете определить пользовательские методы, и рекурсивная функция main не будет работать с каждой программой) Оператор?: Не работает для всех ситуаций. AFAIK, вы не можете вызвать функцию void с помощью?: Так как она хочет присвоить значение как часть своей операции.

Эти условия исходят из того, что IB Computer Science SL требует курса, я беру HL, и как класс, мы смеялись над факторами «мастерства» для SL, которые включают операторы «если» (И ​​если факт, что 3/15 из них являются 'Определяемые пользователем методы с параметрами и типами возвращаемых данных) Сложность состоит в том, чтобы СОВЕРШЕННО ВЫПОЛНИТЬ тест мастерства в SL, все еще создавая программу, которая функционирует правильно.

Ответ: (бдарес)

String result = (CONDITION)?"0":"A";
try{
    Integer.parseInt(result);
    //Condition is true
} catch(NumberFormatException e){
    //Condition is false
}

Ответы [ 5 ]

2 голосов
/ 31 октября 2011

Вы можете использовать условный оператор и переключатель:

switch( CONDITION ? 1 : 0 )
{
    case 1:
        //... true code
        break;
    case 0:
        //... false code
        break;
}

Для циклов вы можете развернуть свой код до некоторого предопределенного максимума и использовать помеченные разрывы, чтобы выпрыгнуть из развернутого кода на ранней основе в зависимости от некоторых условий. Вы можете использовать break для завершения любого блока кода в Java, а не только циклов.

В языке Java нет goto, но в Виртуальной машине он есть, поэтому вы, конечно, также можете напрямую генерировать инструкции JVM, хотя это не будет сильно отличаться от обычного компилятора Java, который также преобразует все циклы if в инструкции перехода.

2 голосов
/ 31 октября 2011
if(A) {
    X();
}
else{
    Y();
}

можно преобразовать в:

A?X():Y();

Вы можете вкладывать их все, что хотите, или просто удалить одну сторону : и получить простую if.Условные обозначения просты.

Если вы хотите, чтобы это работало для пустых методов, вот способ:

String result = A?"0":"A";
try{
    Integer.parseInt(result);
    X();
} catch(NumberFormatException e){
    Y();
}
1 голос
/ 31 октября 2011

Я не уверен, что можно написать целую полезную программу без использования оператора if. Однако я думаю, что ваш учитель может понять, что вы можете написать код, следуя тому же «логическому» пути, используя более объектно-ориентированный подход вместо оператора if. Например:

public interface Moveable {
  void move(int x, int y);
}

public class Ball implements Moveable {
  private int x;
  private int y;

  public void move(int x, int y) {
    this.x = x;
    this.y = y;
  }
}

public class NullMoveable {
  public void move(int x, int y) {
    // Do nothing.
  }
}

... а затем в вашем основном коде приложения:

Moveable mv = new NullMoveable();    
// Move object; don't care if it's a Ball or a NullMoveable
// so no need to explicitly check with an if-statement.
mv.move(10, 50);

Принцип здесь заключается в том, что чем меньше возможных путей в вашем коде (из-за операторов if), тем легче его тестировать и поддерживать.

0 голосов
/ 31 октября 2011

Если вам разрешено использовать анонимные внутренние классы (они, вероятно, классифицируются как определяемые пользователем методы, но я позволю вам быть судьей):

if(COND) {
  X();
} else {
  Y();
}

становится:

ifReplacement(COND, 
              new Runnable() { public void run() { X();}},
              new Runnable() { public void run() { Y();}});

с подписью:

public static void ifReplacement(boolean condition,
                                 Runnable ifBranch,
                                 Runnable elseBranch)

Конечно, лямбды JDK8 сделали бы это намного лучше:

ifReplacement(COND, ()->X(), ()->Y());
0 голосов
/ 31 октября 2011

В некоторых случаях вы можете использовать битовые манипуляции.Например:

if(x > 0) // positive number
{
    isPositive = true;
}
else // negative number
{
    isPositive = flase;
}

эквивалентно:

isPositive = (x >> 31) == 0;

РЕДАКТИРОВАТЬ:

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

...