C++17 常用新特性:带初始化的 if 和 switch 语句

点击蓝字

388babc0d5d48d39cfa16a0621d065a9.png

关注我们

因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享

来源于网络,侵删

早在2016-03-14,Thomas Köppe 在https://wg21.link/p0305r0中就提出了在if和switch使用初始化语句,使用时的代码示例如下:

if (int s = check(); s != 0) {
return s;
}

在上面的代码中,初始化语句是int s = check()。s的生命周期是整个if语句,这里也包含else语句。

1 带初始化的if语句

if初始化语句中定义的变量在整个if语句范围内都是生效的。包括else if和else语句。例如:

std::ofstream getLogStrm(){
    std::ofstream file3("c:\\x.123");
    return file3;
};
std::map<int,int> coll;
int main()
{
   if (std::ofstream strm = getLogStrm(); coll.empty()) {
        strm << "<no data>\n";
        }
        else {
        for (const auto& elem : coll) {
            strm << elem.first << '\n';
        }
    }
    return 0;
}

如上,if语句中的strm的生命周期在执行完if语句后就被析构了。在来看下面这段代码。这段代码来源于https://wg21.link/p0305r0。如下:

if (std::lock_guard<std::mutex> lk(mx_); v.empty()) {
    v.push_back(kInitialValue);
}

上面的这段代码转换成旧式代码如下:

std::lock_guard<std::mutex> lk(mx_)
if(v.empty(){
  v.push_back(kInitialValue);
}

可以看出,两段代码几乎没有什么区别,唯一的差别可能是lock_guard定义的位置不一样。

同样,为了让lock_guard有效,就需要给它定义一个变量。如果没有定义变量那么它在创建后就会立即被销毁。如下:

if (std::lock_guard<std::mutex>{mx_}; 
  v.empty()) //锁已经被销毁
  {
    v.push_back(kInitialValue);
  }

上面的代码中,锁被定义后就立即被销毁,在执行后面的语句时实际上是没有加锁的。

同样,在if初始化语句中也可以初始化多个变量,如:

if (int x = qqq1(), int y = qqq2(); x != y) {
    std::cout << "return values " << x << " and " << y << "differ\n";
}

最后,还可以在if语句中对map进行插入操作,并对插入结果进行检查,代码如下:

int main()
{
   std::map<char,int> mymap;
   mymap.insert ({'a',100});
   if(auto [pos,ok] = mymap.insert({'a',100});!ok){
       auto [key,var] = *pos;
       std::cout << "already there: " << key << '\n';
   }
  return 0;
}

2 带初始化的switch语句

在switch语句中使用初始化语句和if中相似,如下代码,可以在switch中获取一个实例,然后根据实例的状态做不同的处理。代码如下:

switch (Foo x = make_foo(); x.status()) {
  default: /* ... */
  case Foo::FINE: /* ... */
  case Foo::GOOD: /* ... */
  case Foo::NEAT: /* ... */
}
 
 
 
 

10f0a20b49c791e36194d6cd62b8778a.gif

如果你年满18周岁以上,又觉得学【C语言】太难?想尝试其他编程语言,那么我推荐你学Python,现有价值499元Python零基础课程限时免费领取,限10个名额!
▲扫描二维码-免费领取

85aaee7bda24d49a2de79143ff91dc07.gif

戳“阅读原文”我们一起进步

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值