龙空技术网

c++ 在 if 和 switch 语句中初始化变量

启辰8 8

前言:

眼前小伙伴们对“变量初始化的语句”大致比较注重,我们都想要剖析一些“变量初始化的语句”的相关资讯。那么小编也在网摘上网罗了一些关于“变量初始化的语句””的相关文章,希望同学们能喜欢,我们一起来学习一下吧!

在 if 和 switch 语句中初始化变量

从 C++17 开始,if 和 switch 现在有了初始化语法,就像 C99 中 for 循环所拥有的那样。这允许你限制在条件中使用的变量的作用域。

如何做到这一点…

你可能习惯了这样的代码:

const string artist{ "Jimi Hendrix" };size_t pos{ artist.find("Jimi") };if(pos != string::npos) {    cout << "found\n";} else {    cout << "not found\n";}

这使得变量 pos 在条件语句的作用域外暴露,需要被管理,或者可能会与其他尝试使用相同符号的尝试发生冲突。

现在你可以将初始化表达式放在 if 条件中:

if(size_t pos{ artist.find("Jimi") }; pos != string::npos) {    cout << "found\n";} else {    cout << "not found\n";}

现在 pos 变量的作用域被限制在条件的作用域内。这保持了你的命名空间的清洁和可管理性。

它是如何工作的…

初始化表达式可以在 if 或 switch 语句中使用。这里有一些每个的例子。

在 if 语句中使用初始化表达式:

if(auto var{ init_value }; condition) {    // var 在这里可见} else {    // var 在这里也可见}// var 在这里不可见

在初始化表达式中定义的变量在 if 语句的整个作用域内可见,包括 else 子句。一旦控制流出 if 语句的作用域,变量将不再可见,任何相关的析构函数将被调用。

在 switch 语句中使用初始化表达式:

switch(auto var{ init_value }; var) {case 1: ...case 2: ...case 3: ......Default: ...}// var 在这里不可见

在初始化表达式中定义的变量在 switch 语句的整个作用域内可见,包括所有的 case 子句和 default 子句(如果包含)。一旦控制流出 switch 语句的作用域,变量将不再可见,任何相关的析构函数将被调用。

还有更多…

一个有趣的用例是限制锁定互斥量的 lock_guard 的作用域。这在初始化表达式中变得简单:

if (lock_guard<mutex> lg{ my_mutex }; condition) {    // 这里发生有趣的事情}

lock_guard 在其构造函数中锁定互斥量,并在析构函数中解锁。现在,当 lock_guard 运行出 if 语句的作用域时,它将自动被销毁。在过去,你可能不得不删除它或将整个 if 语句包含在额外的大括号块中。

另一个用例可能是使用使用输出参数的遗留接口,如下所示的 SQLite:

if(    sqlite3_stmt** stmt,    auto rc = sqlite3_prepare_v2(db, sql, -1, &_stmt,        nullptr);    !rc) {        // 执行 SQL 操作    } else { // 处理错误        // 使用错误代码        return 0;    }

在这里,我可以将语句句柄和错误代码的作用域限制在 if 语句的作用域内。否则,我将需要全局管理这些对象。

使用初始化表达式将有助于保持你的代码紧凑、不杂乱,更简洁,更易于阅读。重构和管理你的代码也会变得更容易。

标签: #变量初始化的语句