Назначьте символ оператора переменной и используйте эту переменную для условной проверки

Можно ли присвоить символ оператора переменной и использовать эту переменную для условной проверки?

char operator= '>';
int val1=10;
int val2=24;
if(val2 operator val1){
 /* some code*/
}

Почему я не могу использовать переменную оператора внутри условий?

5 ответов

Код, написанный на любом языке программирования, необходимо преобразовать в язык ассемблера. Когда это происходит, каждый оператор кода, написанный на языке высокого уровня, переводится в инструкцию/набор инструкций в эквиваленте среднего уровня, т.е. Код JAVA будет переведен на машинные инструкции на языке Assembly.

Здесь операция добавления в следующем выражении

int a = a + 10;

Может быть преобразован в

ADD A 1010;

И когда мы пытаемся получить доступ к значению переменных, он может быть преобразован в команду READ.

Итак, когда вы пытаетесь использовать ' > ' в переменной,

char operator= '>';
int val1=10;
int val2=24;
if(val2 operator val1){
/* some code*/
}

Оператор if,

if(val2 operator val1)

преобразуется в неверную инструкцию. Вместо того, чтобы генерировать эквивалент для сравнения двух значений, он будет считывать переменную "operator".

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

Следовательно, делать такую ​​вещь нельзя.

Каждый компилятор (java, gcc и т.д.) может вести себя по-другому, но цель та же. Если вы прочтете Complier/Compilation/Execution больше, вы узнаете больше. Вот некоторые ссылки:

http://www.coderanch.com/t/559258/java/java/java-codes-converted-assembly-JVM

Составляют ли компиляторы языка программирования сначала сборку или непосредственно машинный код?

Шаги для компиляции программы C.

http://www.herongyang.com/Computer-History/C-Program-Compilation-and-Execution-Process.html


Привет, Это не поддерживается. Думаю, это будет иметь смысл для меня.

Компилятор читает оператор, когда он создает ваше приложение. Он не может знать, что такое оператор, поэтому он не может создать корреляцию, которую я нашел в http://www.daniweb.com/software-development/csharp/threads/266385/c-using-operator-as-a-variable-in-calculations

Они говорят в контексте С#, но я чувствую, что то же самое имеет смысл и здесь.

Вы не можете напрямую это сделать, но есть работа вокруг:

http://www.coderanch.com/t/568212/java/java/arithmetic-operations-operator-stored-variables

Если это действительно необходимо, мы должны использовать в своем коде объекты eval. Я просто попробовал этот пример кода.

package dumb;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class OperatorAsVariable
{
 public static void main( String args[] ) throws ScriptException
 {
 String test = "+";
 System.out.println( 1 + test + 2 );
 ScriptEngineManager manager = new ScriptEngineManager();
 ScriptEngine engine = manager.getEngineByName( "js" );
 System.out.println( engine.eval( 1 + test + 2 ) );
 }
}

Предоставлено: Есть ли функция eval() в Java?


Нет, вы не можете сделать это на Java.

Чтобы динамически определить бинарное отношение, вам необходимо представить отношение как объект, используя метод с двумя аргументами для проверки:

if (binaryRelation.areRelated(a,b))
{
 // Do something
}

В зависимости от ваших потребностей стандартный интерфейс Comparator может быть подходящим или не подходит.


аргументы метода в Java должны быть выражениями. И оператор не является выражением. Это невозможно в Java.

лучшим способом является объект передачи (перечисления), который представляет эти операторы

Пример:

public enum Operator{
 GREATHERTHAN(">") {
 @Override public ****** apply(****** x1, ****** x2) {
 return x1 > x2;
 }
 },LEESTHAN{
 @Override public ****** apply(****** x1, ****** x2) {
 return x1 < x2;
 }
 }
}


Взгляните на Comparator или Comparable и как они используются. Затем определите свой собственный интерфейс, который принимает два аргумента и возвращает логическое значение и предоставляет различные реализации для них (это OOP).

Другим способом было бы ожидать Java 8, у которого будут lambda выражения.

licensed under cc by-sa 3.0 with attribution.