0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

带初始化的if和switch语句详解

jf_B3xDfZry 来源:C语言学习联盟 作者:C语言学习联盟 2022-10-14 10:50 次阅读

早在2016-03-14,Thomas Köppe 就提出了在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 coll;
int main()
{
   if (std::ofstream strm = getLogStrm(); coll.empty()) {
        strm << "
";
        }
        else {
        for (const auto& elem : coll) {
            strm << elem.first << '
';
        }
    }
    return 0;
}

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

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

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

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

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

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

if(std::lock_guard{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
";
}

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

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

2 带初始化的switch语句

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

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

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Switch
    +关注

    关注

    1

    文章

    530

    浏览量

    57761
  • C++
    C++
    +关注

    关注

    21

    文章

    2082

    浏览量

    73127
  • 初始化
    +关注

    关注

    0

    文章

    48

    浏览量

    11724

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

文章出处:【微信号:C语言学习联盟,微信公众号:C语言学习联盟】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    RT-Thread自动初始化详解

    我们知道,在写裸机程序时,当我们完成硬件初始化后,就需要在主函数中进行调用。当我们使用RT-Thread后,完全不需要这样做了,我们可以将硬件等自动初始化。 RT-Thread 自动初始化机制是指
    的头像 发表于 06-25 21:38 1w次阅读
    RT-Thread自动<b class='flag-5'>初始化</b><b class='flag-5'>详解</b>

    C语言中if语句、if-else语句switch语句详解

    在C语言中,有三种条件判断结构:if语句、if-else语句switch语句
    发表于 08-18 16:36 2794次阅读
    C语言中if<b class='flag-5'>语句</b>、if-else<b class='flag-5'>语句</b>和<b class='flag-5'>switch</b><b class='flag-5'>语句</b><b class='flag-5'>详解</b>

    自动初始化机制原理详解

    自动初始化机制是指初始化函数不需要被显式调用,只需要在函数定义处通过宏定义的方式进行申明,就会在系统启动过程中被执行。这篇文章就来探索一下其中的奥秘, 简单理解其原理!
    的头像 发表于 12-16 09:33 617次阅读
    自动<b class='flag-5'>初始化</b>机制原理<b class='flag-5'>详解</b>

    变量初始化的基本原则

    一、变量初始化变量初始化的基本原则为:可综合代码中完成内部变量的初始化,Testbench中完成可综合代码所需的各类接口信号的初始化初始化
    发表于 01-19 07:07

    USART初始化结构体详解

    USART 初始化结构体详解标准库函数对每个外设都建立了一个初始化结构体,比如USART_InitTypeDef,结构体成员用于设置外设工作参数,并由外设初始化配置函数,比如USART
    发表于 02-22 06:08

    手机模块初始化向导

    手机模块初始化向导:为了刚好的对手机模块进行初始化,所以把最基本的向导写下来.本向导适用于本公司的西门子TC35I和华为GT9000模块。一、在初始化手机模块前,请先确定DT
    发表于 09-18 09:41 17次下载

    RDA1846S初始化设置

    RDA1846S初始化设置RDA1846S初始化设置RDA1846S初始化设置
    发表于 01-15 17:08 0次下载

    UCOS_III_配置与初始化

    UCOS_III_配置与初始化
    发表于 12-20 22:53 5次下载

    HX711初始化程序

    这是HX711的初始化程序
    发表于 02-08 01:51 89次下载

    ds1302时钟芯片初始化,自动决定DS1302是否需要初始化程序

    ds1302芯片时钟芯片大家都在问到底需要不需要初始化?这篇文章将会给大家一个程序,可以自动决定DS1302是否需要初始化
    发表于 10-19 19:19 8259次阅读

    8253初始化程序分享_8253应用案例

    本文首先介绍了8253概念及8253各通道的工作方式,其次详细介绍了8253初始化要求及编程,最后用一个例子介绍了8253的初始化程序。
    发表于 05-23 15:52 2.2w次阅读
    8253<b class='flag-5'>初始化</b>程序分享_8253应用案例

    在51平台下初始化文件的引入导致全局变量无法初始化的问题如何解决

    本文档的主要内容详细介绍的是在51平台下初始化文件的引入导致全局变量无法初始化的问题如何解决。
    发表于 08-20 17:31 0次下载
    在51平台下<b class='flag-5'>初始化</b>文件的引入导致全局变量无法<b class='flag-5'>初始化</b>的问题如何解决

    一文详解RT-Thread自动初始化

    在学RT-Thread时,经常能听到这个词:自动初始化。用起来也非常容易,一个宏就解决了,但是原理是什么呢?
    的头像 发表于 07-21 10:17 7258次阅读
    一文<b class='flag-5'>详解</b>RT-Thread自动<b class='flag-5'>初始化</b>

    C++之初始化列表学习的总结

    类中可以使用初始化列表对成员进行初始化
    的头像 发表于 12-24 17:39 686次阅读

    Java中switch语句的使用

    在Java学习中我们见过很多有意思的语句if语句、for语句、while语句switch语句
    的头像 发表于 03-08 11:03 872次阅读
    Java中<b class='flag-5'>switch</b><b class='flag-5'>语句</b>的使用