c 17之 if和switch語句中初始化變數

2021-09-26 11:13:20 字數 1788 閱讀 4912

從c++17開始,if和switch控制結構現在允許我們在條件語句或選擇子句旁邊指定乙個初始化子句。

例如:

if (int result = getresult(); result != -1)

//result 變數的有效範圍到此為止。

1. 首先介紹下if判斷語句中變數的初始化

在if語句中初始化的任何值在then和else部分結束之前都是有效的(如果有的話)。

例1:

#include constexpr int defaultvalue = 100;

int getvalue(int i)

int main()

else

//result變數的有效範圍到此為止

}

列印結果:

result = 100

再舉另外乙個列子:

例2:

std::mutex collmutex;

if (std::lock_guardlg; !coll.empty())

由於c++17新語法特性,我們也可以寫成如下:

if (std::lock_guard lg; !coll.empty())//注意std::lock_guard不需要指定模板型別std::mutex了

這段**等價於:

;

if (!coll.empty())

}

但是要注意,在這裡的初始化變數必須要有乙個名字,否則,初始化的匿名變數立馬就會銷毀了。

列如:

if (std::lock_guard; // run-time error:

!coll.empty())

if判斷語句裡面直接定義變數還有乙個好處,有些變數的可見範圍縮小了。

例3:

#include #include #include std::mapcplusplus;

int main(void)

else

if (auto [iter, result] = cplusplus.emplace("c++17", 2017); not result)//iter, result的變數僅在if語句中可見

else

return 0;

}

列印結果:

already there: c++14, value is 2014

emplace successfully: c++17, value is 2017

按照以前的寫法:

const auto  result cplusplus.emplace("c++17", 2017); //result的變數在後續語句中都是可見的

if (not result.second) 

二 switch宣告語句中的變數初始化

跟if的差不多,舉個例子;

例4:

#include #include #include namespace fs = std::filesystem;

int main()

; switch(fs::path p(file_name); fs::status(p).type())

break;

default:

std::cout << p << " exists." << std::endl;

} return 0;

}

C 17 之 結構繫結

注意 結構繫結 structured binding 位於iso iec14882 2017 11.5 節.結構繫結的作用是方便從其它資料結構中提取資料,如 pair,tuple,陣列等.通過結構繫結,可以替代 c 17 之前的 std tie,並且使用更加方便.通用的宣告方式為 auto v1,v...

C 17 和 操作符分析

後置int i 0 i i i i i i 兩個表示式的值分別會是多少呢?例項分析 令人頭疼的兄弟 include int main 輸出 1 vc i 3 r 0 i 6 r 18 輸出 2 gcc i 3 r 0 i 6 r 16 分析 1 彙編 vc r i i i mov eax,dword...

c 語法之switch語句

switch語句在c或c 語言中是非常普通的乙個語句了,而且我們也是經常用到的。而且我們使用的switch語句都是和case default break等語句一起使用的。switch語句的使用可以非常的簡單,也可以非常的複雜,所以你可以看到下面的一些另類的使用。首先問一下的是 你知道switch文法...