Почему Visual Basic Editor преобразует научную запись в число с символом # в конце? - PullRequest
0 голосов
/ 27 августа 2018

Я не могу найти информацию по этому вопросу:

Я инициализирую переменную, и когда я вписываю число в научную нотацию, например 8.45673E11, но оно преобразует его в стандартную форму со сложным знаком в конце 845673000000 # - я хотел бы знать, предполагается ли это случиться? Есть ли настройка, которая контролирует это автоматическое преобразование? Что означает составной знак?

Большое спасибо! Lana

1 Ответ

0 голосов
/ 27 августа 2018

Это происходит потому, что когда вы набираете код в VBE, то, что вы видите, НЕ то, что вы получаете .

Текущая строка кода - просто текст: она не понимается как code , пока вы не нажмете ENTER или не уйдете от этой строки. Затем под капотом происходит несколько вещей:

  • VBE анализирует текущую строку кода и определяет, может ли она быть скомпилирована.
    • Если это недопустимый оператор, он либо выдает окно сообщения об ошибке компиляции, либо выделяет оператор красным (в зависимости от настроек VBE «компилировать по требованию»).
  • Действительный код скомпилирован в инструкции P-Code и хранится вместе с источником в главном документе - хотя на данный момент все это только в памяти.
  • P-код переводится обратно в исходный код VBA, а введенная вами строка кода переписывается на месте.

Поэтому, когда вы пишете Foo = 8.45673E11, VBE определяет, что RHS присвоения является двойным литералом , и компилирует соответствующую инструкцию P-кода; когда эта инструкция переводится обратно в исходный код VBA, она «переписывается» в виде явного двойного литерала , 845673000000# (суффикс # является подсказкой типа , означающей «это a Double "), поскольку P-Code не заботится о представлении числа (например, научной записи), только о самом числе; добавлен символ подсказка типа , так что тип уже известен и не требует повторной оценки при следующей компиляции выражения.

И когда вы пишете Foo = 8.45673E11, вы все равно получаете Foo = 845673000000#, потому что P-код не заботится о этом пробеле.

Именно поэтому, учитывая Public Foo As Double, если вы наберете foo = 123, вы получите Foo = 123, потому что внутренняя таблица символов имеет Foo с заглавными буквами F.

...