daiki8は片付けができない

片付けしないと

独習C++新版

www.shoeisha.co.jp


以前から気になっていた本独習C++新版を購入しました。

独習シリーズは古い版を一度読んだことがあり、とてもお世話になったのですが、

そのあと、新版がでたみたいほしいなと思っていました。

ついに購入したので、ぼちぼち読んでいこうと思います。

以下、独習C++新版で紹介されている内容の一部をまとめてみます。

break文とフォールスルー

おなじみの条件分岐のswitch文ではcase文でケースごとに処理を分割できます。
あるケースにマッチした時、その処理内最後でbreak文かないと、それ以降の
caseもすべてマッチしてしまいます。

#include <iostream>

int main()
{
	int a = 1;
	switch (a)
	{
	case 1: // fallthrough
		std::cout << "1" << std::endl;
	case 2: // fallthrough
		std::cout << "2" << std::endl;
	case 3:
		std::cout << "3" << std::endl;
	default:
		std::cout << "default" << std::endl;
	}

	return 0;
}

上のコードを実行すると
1
2
3
default
とすべてのケースの処理が実行されます。
このように、処理がとまらず次のラベルに進むことをフォールスルーと呼びます。

フォールスルーを意図的に行いたい場合は、コメントで明記してあげるなどするのが良いそうです。

独習C++ではコメントアウトして明記しているサンプルコードがのっています。

属性: fallthrough

ja.cppreference.com

C++17からはフォールスルーを明記してコンパイラの警告をさせない方法が作られたみたいです。

void f(int n) {
  void g(), h(), i();
  switch (n) {
    case 1:
    case 2:
      g();
     [[fallthrough]];
    case 3: // このフォールスルーは警告されません。
      h();
    case 4: // このフォールスルーは警告されるかもしれません。
      if(n < 3) {
          i();
          [[fallthrough]]; // OK。
      }
      else {
          return;
      }
    case 5:
      while (false) {
        [[fallthrough]]; // ill-formed。 次の文が同じ繰り返しの一部でありません。
      }
    case 6:
      [[fallthrough]]; // ill-formed。 後続の case または default ラベルがありません。
  }
}