VB.NET XML-анализатор цикла

Почему не выдают ошибку компиляции или исключение времени выполнения?

blockquote>

Поскольку спецификация языка требует, чтобы арифметика на примитивных типа была по модулю 2^width, поэтому -1 становится 2^16-1 как char.

В разделе о целых операциях указано, что

Встроенный целочисленные операторы никак не указывают на переполнение или недополнение.

blockquote>

, чтобы запретить бросать исключение.

Для используемого оператора postfix-декремента, в частности, его поведение указанный в 15.14.3

В противном случае значение 1 вычитается из значения переменной, а разница сохраняется в переменной. Перед вычитанием выполняется двоичное числовое продвижение (§5.6.2) на значение 1 и значение переменной. При необходимости различие сужается сужением примитивного преобразования (п. 5.1.3) и / или подвергается конверсии бокса (п. 5.1.7) к типу переменной до ее сохранения. Значение выражения постфиксного декремента - это значение переменной до того, как будет сохранено новое значение.

blockquote>

Двоичное числовое продвижение преобразует оба значения: 1 и int (поскольку тип здесь char), таким образом, у вас есть промежуточный результат -1 как int, тогда выполняется сужающее примитивное преобразование:

Сужение преобразования знакового целого числа в интегральный тип T просто отбрасывает все, кроме n бит младшего разряда, где n - количество бит, используемых для представления типа T. В дополнение к возможной потере информации о величине числового значения это может привести к признаку результата значение отличается от знака входного значения.

blockquote>

, что приводит к char значению 0xFFFF (поскольку Java указывает двоичное представление представления для его знаковых целых типов, явно указанных в спецификация унарный минус ):

Для целых значений отрицание такое же, как и вычитание от нуля. Язык программирования Java использует представление двух дополнений для целых чисел, а диапазон значений двух дополнений не является симметричным, поэтому отрицание максимального отрицательного int или long приводит к тому же максимальному отрицательному числу. В этом случае происходит переполнение, но исключение не генерируется. Для всех целочисленных значений x, -x равно (~ x) +1.

blockquote>

Для общего поведения обертывания для результатов вне диапазона в качестве примера в спецификация оператора умножения :

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

blockquote>

Подобные фразы встречаются в спецификации целочисленное сложение и вычитание требуются для выполнения a - b == a + (-b), поэтому следует поведение переполнения.

1
задан abatishchev 26 May 2010 в 23:55
поделиться

2 ответа

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

Вам нужно дважды вызвать ReadEndElement () в конце цикла.

1
ответ дан 3 September 2019 в 00:19
поделиться

Если вы можете использовать .NET 3.5, я бы рекомендовал использовать XML литералы и синтаксис LINQ.

Dim ips = From xe In XElement.Parse(xmlString).<ip> _
          Select New With {.IP = xe.<ip>.Value, _
                           .Ping = xe.<ping>.Value, _
                           .HostName = xe.<hostname>.Value}
'if you only want one
Dim firstIp = ips.First()

Существует также XElement.Load, который можно использовать для загрузки из файла.

1
ответ дан 3 September 2019 в 00:19
поделиться
Другие вопросы по тегам:

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