函数或代码中间的代码块

Code blocks in the middle of a function or code

本文关键字:代码 中间 函数      更新时间:2023-10-16

在函数或程序中间拥有代码块的意义是什么,如下面的示例

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

据我所知,这会创建一个新的 scope,因此在{}中声明的任何对象或变量仅在此处可用。这对于创建objects的实例特别有用,因为该对象的destructor在范围内时将被调用。

在这种情况下,由于没有声明或创建对象,因此不需要{}

在函数或程序中间拥有代码块

是什么意思

括号用于控制范围。开场支架创造了一个新的较小范围。闭合支架结束了新的和较小的范围。

如果在较小的范围中声明了自动var,则自动vars在闭合支架处停止。在下一个范围中,它可以释放可重复使用的变量名称。


尽管您的代码示例中没有任何特别的事情发生,但是在闭幕式上可能会发生一些特殊的事情。范围的末端还可以免费使用自动记忆var,包括调用用户定义对象(类或结构)的DTOR。


在以下内容中,块1(命名为"使用自动促销")显示了一种使用自动促销来创建值'result'中所需的字节顺序的方法,并供用户检查。

在第2块(使用static_cast)中,可以实现相同的功能,并注意它恰好使用名称为"结果"的声明的自动变量。与第一块自动VAR没有发生碰撞,因为闭合支架结束了块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;
  }

一个人可以通过控制内部自动var的范围来捕获自动记忆并释放它。此内存甚至可以用不同的名称重复使用。

代码块(对于较小的范围)允许程序员使用自动记忆的使用方式不同。


函数'SC'旨在减少键入。

//          vvvvvvvv ---- formal parameter allows auto-promotion
uint64_t sc(uint64_t ui64) {
  return static_cast<uint64_t>(ui64); // static cast
}

在这种特殊情况下,使用块是完全不需要的。

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