91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

帶初始化的if和switch語(yǔ)句詳解

jf_B3xDfZry ? 來(lái)源:C語(yǔ)言學(xué)習(xí)聯(lián)盟 ? 作者:C語(yǔ)言學(xué)習(xí)聯(lián)盟 ? 2022-10-14 10:50 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

早在2016-03-14,Thomas K?ppe 就提出了在if和switch使用初始化語(yǔ)句,使用時(shí)的代碼示例如下:

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

在上面的代碼中,初始化語(yǔ)句是int s = check()。s的生命周期是整個(gè)if語(yǔ)句,這里也包含else語(yǔ)句。

1 帶初始化的if語(yǔ)句

if初始化語(yǔ)句中定義的變量在整個(gè)if語(yǔ)句范圍內(nèi)都是生效的。包括else if和else語(yǔ)句。例如:

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語(yǔ)句中的strm的生命周期在執(zhí)行完if語(yǔ)句后就被析構(gòu)了。在來(lái)看下面這段代碼。這段代碼來(lái)源于https://wg21.link/p0305r0。如下:

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

上面的這段代碼轉(zhuǎn)換成舊式代碼如下:

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

可以看出,兩段代碼幾乎沒(méi)有什么區(qū)別,唯一的差別可能是lock_guard定義的位置不一樣。

同樣,為了讓lock_guard有效,就需要給它定義一個(gè)變量。如果沒(méi)有定義變量那么它在創(chuàng)建后就會(huì)立即被銷毀。如下:

if(std::lock_guard{mx_};
  v.empty()) //鎖已經(jīng)被銷毀
  {
    v.push_back(kInitialValue);
}

上面的代碼中,鎖被定義后就立即被銷毀,在執(zhí)行后面的語(yǔ)句時(shí)實(shí)際上是沒(méi)有加鎖的。

同樣,在if初始化語(yǔ)句中也可以初始化多個(gè)變量,如:

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

最后,還可以在if語(yǔ)句中對(duì)map進(jìn)行插入操作,并對(duì)插入結(jié)果進(jìn)行檢查,代碼如下:

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語(yǔ)句

在switch語(yǔ)句中使用初始化語(yǔ)句和if中相似,如下代碼,可以在switch中獲取一個(gè)實(shí)例,然后根據(jù)實(shí)例的狀態(tài)做不同的處理。代碼如下:

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

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Switch
    +關(guān)注

    關(guān)注

    1

    文章

    542

    瀏覽量

    61741
  • C++
    C++
    +關(guān)注

    關(guān)注

    22

    文章

    2123

    瀏覽量

    77110
  • 初始化
    +關(guān)注

    關(guān)注

    0

    文章

    52

    瀏覽量

    12372

原文標(biāo)題:C++17 常用新特性:帶初始化的 if 和 switch 語(yǔ)句

文章出處:【微信號(hào):C語(yǔ)言學(xué)習(xí)聯(lián)盟,微信公眾號(hào):C語(yǔ)言學(xué)習(xí)聯(lián)盟】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    RT-Thread自動(dòng)初始化詳解

    我們知道,在寫(xiě)裸機(jī)程序時(shí),當(dāng)我們完成硬件初始化后,就需要在主函數(shù)中進(jìn)行調(diào)用。當(dāng)我們使用RT-Thread后,完全不需要這樣做了,我們可以將硬件等自動(dòng)初始化。 RT-Thread?自動(dòng)初始化機(jī)制是指
    的頭像 發(fā)表于 06-25 21:38 ?1.3w次閱讀
    RT-Thread自動(dòng)<b class='flag-5'>初始化</b><b class='flag-5'>詳解</b>

    C語(yǔ)言中if語(yǔ)句、if-else語(yǔ)句switch語(yǔ)句詳解

    在C語(yǔ)言中,有三種條件判斷結(jié)構(gòu):if語(yǔ)句、if-else語(yǔ)句switch語(yǔ)句
    發(fā)表于 08-18 16:36 ?1.4w次閱讀
    C語(yǔ)言中if<b class='flag-5'>語(yǔ)句</b>、if-else<b class='flag-5'>語(yǔ)句</b>和<b class='flag-5'>switch</b><b class='flag-5'>語(yǔ)句</b><b class='flag-5'>詳解</b>

    自動(dòng)初始化機(jī)制原理詳解

    自動(dòng)初始化機(jī)制是指初始化函數(shù)不需要被顯式調(diào)用,只需要在函數(shù)定義處通過(guò)宏定義的方式進(jìn)行申明,就會(huì)在系統(tǒng)啟動(dòng)過(guò)程中被執(zhí)行。這篇文章就來(lái)探索一下其中的奧秘, 簡(jiǎn)單理解其原理!
    的頭像 發(fā)表于 12-16 09:33 ?1951次閱讀
    自動(dòng)<b class='flag-5'>初始化</b>機(jī)制原理<b class='flag-5'>詳解</b>

    變量初始化的基本原則

    一、變量初始化變量初始化的基本原則為:可綜合代碼中完成內(nèi)部變量的初始化,Testbench中完成可綜合代碼所需的各類接口信號(hào)的初始化。初始化
    發(fā)表于 01-19 07:07

    USART初始化結(jié)構(gòu)體詳解

    USART 初始化結(jié)構(gòu)體詳解標(biāo)準(zhǔn)庫(kù)函數(shù)對(duì)每個(gè)外設(shè)都建立了一個(gè)初始化結(jié)構(gòu)體,比如USART_InitTypeDef,結(jié)構(gòu)體成員用于設(shè)置外設(shè)工作參數(shù),并由外設(shè)初始化配置函數(shù),比如USART
    發(fā)表于 02-22 06:08

    手機(jī)模塊初始化向?qū)?/a>

    手機(jī)模塊初始化向?qū)?為了剛好的對(duì)手機(jī)模塊進(jìn)行初始化,所以把最基本的向?qū)?xiě)下來(lái).本向?qū)нm用于本公司的西門(mén)子TC35I和華為GT9000模塊。一、在初始化手機(jī)模塊前,請(qǐng)先確定DT
    發(fā)表于 09-18 09:41 ?17次下載

    RDA1846S初始化設(shè)置

    RDA1846S初始化設(shè)置RDA1846S初始化設(shè)置RDA1846S初始化設(shè)置
    發(fā)表于 01-15 17:08 ?0次下載

    UCOS_III_配置與初始化

    UCOS_III_配置與初始化
    發(fā)表于 12-20 22:53 ?5次下載

    HX711初始化程序

    這是HX711的初始化程序
    發(fā)表于 02-08 01:51 ?92次下載

    8253初始化程序分享_8253應(yīng)用案例

    本文首先介紹了8253概念及8253各通道的工作方式,其次詳細(xì)介紹了8253初始化要求及編程,最后用一個(gè)例子介紹了8253的初始化程序。
    發(fā)表于 05-23 15:52 ?2.3w次閱讀
    8253<b class='flag-5'>初始化</b>程序分享_8253應(yīng)用案例

    在51平臺(tái)下初始化文件的引入導(dǎo)致全局變量無(wú)法初始化的問(wèn)題如何解決

    本文檔的主要內(nèi)容詳細(xì)介紹的是在51平臺(tái)下初始化文件的引入導(dǎo)致全局變量無(wú)法初始化的問(wèn)題如何解決。
    發(fā)表于 08-20 17:31 ?0次下載
    在51平臺(tái)下<b class='flag-5'>初始化</b>文件的引入導(dǎo)致全局變量無(wú)法<b class='flag-5'>初始化</b>的問(wèn)題如何解決

    一文詳解RT-Thread自動(dòng)初始化

    在學(xué)RT-Thread時(shí),經(jīng)常能聽(tīng)到這個(gè)詞:自動(dòng)初始化。用起來(lái)也非常容易,一個(gè)宏就解決了,但是原理是什么呢?
    的頭像 發(fā)表于 07-21 10:17 ?8830次閱讀
    一文<b class='flag-5'>詳解</b>RT-Thread自動(dòng)<b class='flag-5'>初始化</b>

    C++之初始化列表學(xué)習(xí)的總結(jié)

    類中可以使用初始化列表對(duì)成員進(jìn)行初始化
    的頭像 發(fā)表于 12-24 17:39 ?1577次閱讀

    Java中switch語(yǔ)句的使用

    在Java學(xué)習(xí)中我們見(jiàn)過(guò)很多有意思的語(yǔ)句if語(yǔ)句、for語(yǔ)句、while語(yǔ)句switch語(yǔ)句
    的頭像 發(fā)表于 03-08 11:03 ?1772次閱讀
    Java中<b class='flag-5'>switch</b><b class='flag-5'>語(yǔ)句</b>的使用

    GraniStudio:初始化例程

    1.文件運(yùn)行 導(dǎo)入工程 雙擊運(yùn)行桌面GraniStudio.exe。 通過(guò)引導(dǎo)界面導(dǎo)入初始化例程,點(diǎn)擊導(dǎo)入按鈕。 打開(kāi)初始化例程所在路徑,選中初始化.gsp文件,點(diǎn)擊打開(kāi),完成導(dǎo)入。 2.功能
    的頭像 發(fā)表于 08-22 16:45 ?893次閱讀
    GraniStudio:<b class='flag-5'>初始化</b>例程