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

    文章

    514

    浏览量

    57539
  • C++
    C++
    +关注

    关注

    21

    文章

    2066

    浏览量

    72900
  • 初始化
    +关注

    关注

    0

    文章

    48

    浏览量

    11627

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

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

收藏 人收藏

    评论

    相关推荐

    RT-Thread自动初始化详解

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

    请问DMA通道的初始化顺序是什么?

    哪位用过STM32F103rct6DAC ,DMA通道的初始化顺序哪位知道啊?谢谢!!!我的邮箱:41068439@qq.com
    发表于 06-27 04:35

    为什么串口初始化程序会影响LCD?

    今天在弄TFTLCD显示 实验的时候没把例程里串口的初始化加进去,结果烧进去后屏幕一片空白,我又加上了这个语句,结果居然灯也不亮。我看了一下串口初始化里的东西,应该是没什么影响的啊。时钟什么的在
    发表于 11-08 04:35

    系统的stm32的时钟初始化在哪?

    今天在看stm32上移植ucosii的资料,发现系统的程序的mian里没有系统时钟的初始化,请问他们把系统时钟的初始化放到哪去了?
    发表于 03-15 23:27

    蓝牙广播初始化详解

    第一讲 讲述了蓝牙样例的建立,第二讲 描述了协议栈初始化,本讲讲探讨下广播初始化问题:具体教程如下,兼容52系列:宝贝链接点击具体教程如下,兼容52系列:宝贝链接点击青风手把手教你学蓝牙34:蓝牙
    发表于 07-20 04:26

    端口初始化初始化中断

    目录PA9(TX),PA10(RX)1、端口初始化2、初始化外设3、初始化中断4、使能中断5、使能外设5、发送数据PA9(TX),PA10(RX)1、端口初始化1.开启PA时钟2.PA
    发表于 08-16 06:54

    STM32串口初始化与使用详解

    STM32串口初始化与使用详解串口简介串口初始化具体步骤串口收发理论代码执行串口简介USART(Universal Synchronous/Asynchronous Receiver
    发表于 08-19 06:06

    【原创分享】变量的初始化技巧

    形式。从表面上来看方式1要简单很多,实际上,无论从代码的规模上,还是效率上,二者都没有太大区别。方式1看似直接使用初始化的过程完成赋值,实际上对于类似char a[10]=”abcde”形式的语句
    发表于 09-08 15:28

    变量初始化的基本原则

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

    USART初始化结构体详解

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

    Proteus之switch语句的应用

    Proteus之switch语句的应用,很好的Proteus资料,快来学习吧。
    发表于 04-18 14:49 0次下载

    Java中switch语句的使用

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

    java中的switch语句 case的取值

    Java中的switch语句是一种用于多重条件判断的语句,用于根据不同的条件执行不同的代码块。在switch语句中,case关键字用来指定不
    的头像 发表于 11-30 16:05 329次阅读