Страницы

Поиск по вопросам

пятница, 29 ноября 2019 г.

Употребление фигурных скобок компилятором

#c_sharp


Любая конструкция if может быть записана с фигурными скобками или без них. К примеру:

bool j = true;
if(j==true)
    MessageBox.Show("That's true")


Или же так:

bool j = true;
if(j==true)
{
   MessageBox.Show("That's true")
}


Разговор идет только конструкции if с единственным действием.
Отсюда несколько вопросов:


Игнорирует ли компилятор эти скобки?
Если нет, обращает ли внимание программа на них?
Оказывают ли влияние эти скобки на быстродействие программы (хоть самую незначительную)?

    


Ответы

Ответ 1



Если обратиться к спецификации Для if statement if_statement: | 'if' '(' boolean_expression ')' embedded_statement | 'if' '(' boolean_expression ')' embedded_statement 'else' embedded_statement ; Для циклов. например while: while_statement: | 'while' '(' boolean_expression ')' embedded_statement ; Как можно заметить на уровне спецификации никаких скобочек нет. В свою очередь embedded_statement раскрывается так: embedded_statement: | block | empty_statement | expression_statement | selection_statement | iteration_statement | jump_statement | try_statement | checked_statement | unchecked_statement | lock_statement | using_statement | yield_statement | embedded_statement_unsafe ; И скобочки в данном случае являются частью block block: | '{' statement_list? '}' ; Таким образом, можно сказать, что: Компилятор скобки не игнорирует, так как они являются частью синтаксической конструкции сама программа на них не может обращать внимания, но отличие в использовании все-таки есть. Например: внутри блока можно определять переменные, без скобок - нет. Так как это чисто синтаксическая конструкция на быстродействие скобки никакого влияния не оказывают.

Ответ 2



Компилятор эти скобки не игнорирует, а просто позволяет нам их либо писать, либо не писать. Грубо говоря, когда он разбирает текст программы в абстрактное синтаксическое дерево, то не зависимо от наличия или отсутствия скобок, структура дерева полученного в результате будет одна и та же. Таким образом, даже на уровне абстрактного дерева, которое еще не совсем программа, этих скобок уже не существует. Поэтому, независимо от того, каким образом выполняется код, можно смело утверждать что программа на эти скобки внимание не обращает, и влияние на время выполнения программы они не оказывают.

Ответ 3



Компилятор и первый вариант, и второй компилирует в один и тот же msil код (с настроенным параметром "оптимизированный код", который по умолчанию в режиме релиза) Внутри программы после компиляции нет скобок. Грубо говоря там просто непрерывная последовательность команд с каким-то аналогом goto (условным и безусловным) Не оказывает даже незначительного влияния UPD В конфигурации отладки на каждую фигурную скобку добавляется nop-код в msil'е и nop-инструкция в нативном коде. Делается это, как было замечено в комментариях, для удобства отладки

Комментариев нет:

Отправить комментарий