iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 19
0
Software Development

山姆大叔談 C++:從歷史談起,再給個定義—Modern C++ 解惑系列 第 19

DAY 18: 新語法 if and switch with Initialization

碼農們老實說,我們已經習慣了下面的 if 條件式寫法:

auto vi = GetIntegers();
if (vi.empty())
  // Do A.
else
  // Do B.

C++ 人很龜毛,這種「小地方」還是有辦法找出「優化」的地方。C++17 納入了 if with initializer,上述程式碼可以改寫成:

if (auto vi = GetIntegers(); !vi.empty())
  // Do A.
else
  // Do B.

除了少一行外,更重要的是 vi 的「可視範圍(Scope)」變小了。好的 C++ 程式碼有一個原則:能達到同樣目的,變數的可視範圍越小越好。

上述例子中,vi 無法被 else 區塊的程式碼使用,大大限縮了可視範圍,減少副作用。

switch 也同樣有 switch with initializer 的新功能,寫法如下:

switch (auto owner{GetOwner()}; owner.type()) {
  case kAccept1Country2System: return "Shit!";
  case kTaiwanIsNotPartOfChina: return "Bravo!";
}

同樣地,owner 只能在 switch statement 的範圍內被使用,這是優點。

Visual Studio 2019 目前以 C++14 為預設值,欲使用上述功能,記得要變更專案設定。


上一篇
DAY 17:為類別設計的新關鍵字們
下一篇
DAY 19:關於新手學習 C/C++ 這件事
系列文
山姆大叔談 C++:從歷史談起,再給個定義—Modern C++ 解惑26
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
chchwy
iT邦新手 4 級 ‧ 2019-10-01 14:14:01

最底下的例子,switch 的括號裡面有兩個 statements。switch 要怎麼知道要用哪個 statement 的回傳值來判斷跑哪個 case? 是一律用最右邊那個 statement 的回傳值嗎? 可以放三個以上的 statements 嗎?

// 比如這樣?
switch (auto owner{GetOwner()}; auto owner2{owner.Father()}; owner2.type()) {
}

好問題。我沒去翻標準規格書,不過,一個 if/switch 裡頭似乎只能有一個 statement(有分號的那一段),另一個是 condition。

if/switch 裡的 statement 一定會先被執行,然後才是後面個 condition。

我要留言

立即登入留言