Я бы инкапсулировал логику оператора (разрешение и оценку) в enum
. Например,
enum Oper {
ADDITION("+"), SUBTRACTION("-"), MULTIPLICATION("*"), DIVISION("/");
Oper(String symbol) {
this.symbol = symbol;
}
public int eval(int a, int b) {
switch (this) {
case ADDITION: return a + b;
case SUBTRACTION: return a - b;
case MULTIPLICATION: return a * b;
case DIVISION: return a / b;
}
return -1;
}
private String symbol;
public static Oper from(String operator) {
for (Oper o : values()) {
if (o.symbol.equals(operator)) {
return o;
}
}
return null;
}
}
Это упрощает логику в main
, просто разрешите оператор и оцените его. Как,
Oper o = Oper.from(operator);
System.out.printf("The %s result is %d%n", o.name().toLowerCase(), o.eval(num1, num2));
То, что вы видите, - это немного унаследованного кода, показывающего его голову.
В основе вопроса тип VT_BOOL Visual Basic 6.0 использовал тип VT_BOOL (AKA VARIANT_BOOL) для своих логических значений. Истина для VARIANT_BOOL представлена значением VARIANT_TRUE, которое имеет целочисленное значение -1. Во время преобразования в .NET было решено, что при использовании подпрограмм преобразования Visual Basic для преобразования логического значения в целочисленное значение семантика Visual Basic 6.0 будет сохраняться для возвращаемого значения; это будет -1.
Первое неявное преобразование происходит со строкой b = i. Под капотом это делает неявное преобразование из целого числа в логическое. Любое ненулевое значение считается истинным, поэтому полученное значение является истинным.
Однако, следующая строка кода выполняет неявное преобразование в целочисленный тип.
i = b
Для этого используется одна из процедур преобразования Visual Basic ( CType или CInt ) для преобразования значение в целое число. Таким образом, семантика Visual Basic работает, и возвращаемое значение равно -1.
Следующая интересная строка - это строка Convert.ToInt32 ()
. Это использует подпрограмму преобразования .NET, которая не использует семантику Visual Basic. Вместо этого он возвращает базовое представление BCL для истинного логического значения, которое равно 1.
Следующая интересная строка - это строка Convert.ToInt32 ()
. Это использует подпрограмму преобразования .NET, которая не использует семантику Visual Basic. Вместо этого он возвращает базовое представление BCL для истинного логического значения, которое равно 1.
Следующая интересная строка - это строка Convert.ToInt32 ()
. Это использует подпрограмму преобразования .NET, которая не использует семантику Visual Basic. Вместо этого он возвращает базовое представление BCL для истинного логического значения, которое равно 1.
В некоторых языках логическое значение true равно -1, а не 1. Мне нужно провести исследование, чтобы понять, почему, как я не помню.
В VB6 константа True
имеет значение -1
.
Однако Convert.ToInt32 (Boolean)
задокументировано как возвращающее «Число 1, если значение истинно; в противном случае - 0». Таким образом, это независимо от того, какой язык фреймворка вы используете.
Редактировать: см. Вопрос логическое true - положительный 1 или отрицательный 1
Что касается того, почему -1 используется для True, я считаю, что это потому, что это буквально (НЕ 0).
Начните с нуля, переверните все биты, а затем прочитайте его как дополнение к двум - получается отрицательное значение.
Так как все, что не является ложным, является истинным, а ложным является 0, (НЕ ложным) представляется как -1.
Хотя это может быть просто совпадением ...
Из документации MSDN Visual Basic:
Когда Visual Basic преобразует числовые значения значения типа данных в Boolean, 0 становится Ложь и все другие значения становятся Правда. Когда Visual Basic преобразует Булевы значения для числовых типов, False становится 0, а Истина становится -1.
И для Convert.ToInt32 (значение) :
перенастраивает число 1, если значение истинно; в противном случае, 0.
Итак, для вашего кода:
i = 1
b = i // b becomes true
i = b // true = -1
Console.WriteLine(i) // i is -1
i = Convert.ToInt32(b) // Convert.ToInt32(true) = 1
Console.WriteLine(i) // i is 1
Это потому, что в VB.NET логические значения равны -1 для истины и 0 для ложных по умолчанию. Я не уверен, почему он печатается как 1 во второй раз, хотя ...