Блоки кода в середине функции или кода

#c #c 11

#c #c 11 #c #c 11

Вопрос:

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

 #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 << "non";

    }// ends here

    return 0;

}
  

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

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

Ответ №1:

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

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

Ответ №2:

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

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

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


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


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

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

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

 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
}
  

Ответ №3:

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

Ответ №4:

 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 << yn";

    }// ends here

    return 0;

}