Блоки кода в середине функции или кода - PullRequest
0 голосов
/ 09 марта 2019

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

#include <iostream>
#include <string>
using namespace std;

int main(){
    int x = 32;

    { // random code block starts here

        if (34 > x){
            cout <<"x greater"<<endl;
        }else cout << "no\n";

    }// ends here

    return 0;

}

Ответы [ 4 ]

0 голосов
/ 09 марта 2019

что означает наличие кодовых блоков в середине функции или программы

Скобки используются для управления областью действия.Открывающая скобка создает новую и меньшую область видимости.Закрывающая фигурная скобка заканчивает новую и меньшую область видимости.

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


Хотя в вашем примере кода ничего особенного не происходит, что-то особенное может произойти в закрывающей скобке.Конец области действия также может освободить переменные авто-памяти, в том числе вызывать dtor пользовательских объектов определения (класса или структур).


В следующем блоке 1 (с именем «использование автоматического продвижения») показан способ использования автоматического продвижения для создания порядка байтов, требуемого в значении «результат», и указания для пользователя:inspect.

В блоке 2 (с использованием static_cast) добивается того же и обратите внимание, что случается повторное использование объявленной автоматической переменной с именем «result».Столкновение с 1-м блоком auto var не происходит, поскольку закрывающая фигурная скобка завершила область для имени 'result' блока 1.

Блок 3 (используя статическую функцию приведения моего собственного создания) делает то же самое... объявляет 'результат' в третий раз, снова без столкновений.

int exec()
  {
     uint8_t byte0 = 0x00;
     uint8_t byte1 = 0xAA;
     uint8_t byte2 = 0x00;
     uint8_t byte3 = 0xAA;

     uint16_t hword0 = 0xAA00;
     //uint16_t hword1 = 0xAAAA; not used

     // using auto-promotion
     {
        uint64_t b4567 = hword0; // auto promotion
        uint64_t b3    = byte3;
        uint64_t b2    = byte2;
        uint64_t b1    = byte1;
        uint64_t b0    = byte0;

        uint64_t result =  (
           (b4567 << 32) |
           (b3    << 24) |
           (b2    << 16) |
           (b1    <<  8) |
           (b0    <<  0)   );

        cout << "\n  " << hex << result << endl;
     }

     // using static cast
     {
        uint64_t result = (
           (static_cast<uint64_t>(hword0) << 32) |
           (static_cast<uint64_t>(byte3)  << 24) |
           (static_cast<uint64_t>(byte2)  << 16) |
           (static_cast<uint64_t>(byte1)  <<  8) |
           (static_cast<uint64_t>(byte0)  << 0 )
           );

        cout << "\n  " << hex << result << endl;
     }

     // using static cast function
     {
        uint64_t result = (
           (sc(hword0) << 32) |
           (sc(byte3)  << 24) |
           (sc(byte2)  << 16) |
           (sc(byte1)  <<  8) |
           (sc(byte0)  << 0 )
           );

        cout << "\n  " << hex << result << endl;
     }

     return 0;
  }

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

Блоки кода (для небольших областей) позволяют программисту использовать автоматическую память по-разному.


Функция 'sc'предназначен для уменьшения набора текста.

//          vvvvvvvv ---- formal parameter allows auto-promotion
uint64_t sc(uint64_t ui64) {
  return static_cast<uint64_t>(ui64); // static cast
}
0 голосов
/ 09 марта 2019
code block can be used to restrict the scope of variables declared in block.           int main(){
    int x = 32;

    { // random code block starts here
        int y = 5;
        if (34 > x){
            cout <<"x greater"<<endl;
        }else cout << y\n";

    }// ends here

    return 0;

}
0 голосов
/ 09 марта 2019

Насколько я знаю, это создает новый scope, поэтому любые объекты или переменные, объявленные в {}, будут доступны только там. Это может быть особенно полезно для создания экземпляров objects, так как destructor для объекта будет вызываться, когда он выходит из области видимости.

В этом случае, однако, нет необходимости в {}, так как нет объявленных переменных или созданных объектов.

0 голосов
/ 09 марта 2019

Использование блока совершенно не нужно в данном конкретном случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...