#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;
}