📜  C++ 17的新功能:如果带有初始化程序的Else和Switch语句

📅  最后修改于: 2021-05-30 05:15:09             🧑  作者: Mango

在许多情况下,我们需要检查函数返回的值,然后根据该值执行条件操作。所以我们的代码看起来像这样

// Some function
return_type foo(params)
  
// Call function with params and 
// store return in var
auto var = foo(params);
  
if (var == /* some value */) { 
   //Do Something
} else {
   //Do Something else
}

没关系,请注意其中有一些微妙之处

  • 变量泄漏到周围的范围内,这不是故意的,必须注意确保此变量不会与其他变量混淆
  • 由于已经定义了此变量,因此,如果我们稍后要在程序中调用另一个函数(例如bar()),则需要创建另一个变量来存储从bar()返回的值
  • 第三,如果编译器可以明确地知道该变量将仅在一个if-else块中使用,则它可能能够更好地优化代码。

注意所有条件if-else块中的通用格式。首先,有一个可选的初始语句来设置变量,然后是if-else块。因此,一般的if-else块如下所示

init-statement

if (condition) {
    // Do Something
} else {
   // Do Something else 
}

在C++ 17中,init语句称为初始化程序,我们可以将其直接放入if-else块中,如下所示

if (init-statement; condition) {
    // Do Something
} else {
    // Do Something else
}

条件变量的范围仅限于当前的if-else块。这也使我们可以在另一个条件块中重用相同的命名标识符。

if (auto var = foo(); condition) {
    ...
}
else{
    ...
}
  
// Another if-else block
if (auto var = bar(); condition) {
    ....
}
else {
    ....
}

同样,开关盒块也已更新。现在,我们可以在开关括号内放置一个初始表达式。在初始语句之后,我们需要指定使用哪个变量来检查案例

switch (initial-statement; variable) {
    ....
    // cases
}

完整的程序

// Program to demonstrate init if-else
// feature introduced in C++17
#include 
#include 
using namespace std;
  
int main() {
  
  // Set up rand function to be used
  // later in program
  srand(time(NULL));
  
  // Before C++17
  int i = 2;
  if ( i % 2 == 0)
    cout << i << " is even number" << endl;
  
  // After C++17
  // if(init-statement; condition)
  if (int i = 4; i % 2 == 0  )
    cout << i << " is even number" << endl;
  
  // Switch statement
  // switch(init;variable)
  switch (int i = rand() % 100; i) {
      default: 
         cout << "i = " << i << endl; break;
  }  
}

输出(取决于机器)

2 is even number
4 is even number
i = 5

注意:要编译这些程序,我们需要最新版本的编译器。在撰写本文时,此功能已在clang 5和gcc 7及更高版本中完全实现。要编译程序,我们还需要指定-std = C++ 17标志

g++-7 program_file.cpp -std=c++17

or

clang++ program_file.cpp -std=c++17
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”