Преобразуйте булевскую переменную в целое число в VB.NET

Я бы инкапсулировал логику оператора (разрешение и оценку) в 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));
34
задан Peter Mortensen 11 September 2016 в 09:59
поделиться

5 ответов

То, что вы видите, - это немного унаследованного кода, показывающего его голову.

В основе вопроса тип 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.

Таким образом, семантика Visual Basic работает, и возвращаемое значение равно -1.

Следующая интересная строка - это строка Convert.ToInt32 () . Это использует подпрограмму преобразования .NET, которая не использует семантику Visual Basic. Вместо этого он возвращает базовое представление BCL для истинного логического значения, которое равно 1.

Таким образом, семантика Visual Basic работает, и возвращаемое значение равно -1.

Следующая интересная строка - это строка Convert.ToInt32 () . Это использует подпрограмму преобразования .NET, которая не использует семантику Visual Basic. Вместо этого он возвращает базовое представление BCL для истинного логического значения, которое равно 1.

45
ответ дан 27 November 2019 в 16:10
поделиться

В некоторых языках логическое значение true равно -1, а не 1. Мне нужно провести исследование, чтобы понять, почему, как я не помню.

В VB6 константа True имеет значение -1 .

Однако Convert.ToInt32 (Boolean) задокументировано как возвращающее «Число 1, если значение истинно; в противном случае - 0». Таким образом, это независимо от того, какой язык фреймворка вы используете.

Редактировать: см. Вопрос логическое true - положительный 1 или отрицательный 1

29
ответ дан 27 November 2019 в 16:10
поделиться

Что касается того, почему -1 используется для True, я считаю, что это потому, что это буквально (НЕ 0).

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

Так как все, что не является ложным, является истинным, а ложным является 0, (НЕ ложным) представляется как -1.

Хотя это может быть просто совпадением ...

10
ответ дан 27 November 2019 в 16:10
поделиться

Из документации 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
7
ответ дан 27 November 2019 в 16:10
поделиться

Это потому, что в VB.NET логические значения равны -1 для истины и 0 для ложных по умолчанию. Я не уверен, почему он печатается как 1 во второй раз, хотя ...

2
ответ дан 27 November 2019 в 16:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: