1. ホーム
  2. c++

[解決済み] if文での変数の初期化

2023-06-30 02:40:09

質問

C++17 では、変数を初期化するために if 文の中で変数を初期化することができます。

if (int length = 2; length == 2)
    //execute something

の代わりに

int length = 2;
if (length == 2)
    //do something

短くなったとはいえ、コードの可読性に影響する(特にこの新機能を知らない人にとっては)ので、大規模なソフトウェア開発では良くないコーディング方法なのでしょう。

コードを短くする以外に、この機能を使うメリットはありますか?

どのように解決するのですか?

の範囲を制限しています。 lengthif だけで済みます。を書くことが許されたとき、私たちがもともと得ていたのと同じ利益を得ることができるわけです。

for(int i = 0; i < ... ; ++i) {
   // ...
}

変数が漏れる代わりに

int i;
for(i = 0; i < ... ; ++i) {
   // ...
}

短命な変数の方が良い理由はいくつかあります。しかし、いくつか挙げると

  1. 何かが短く生きれば生きるほど、関係のないコードの行を読むときに心に留めておく必要のある事柄は少なくなります。もし i がループの外に存在しないか if ステートメントの外側に存在しないのであれば、それらの外側の値を気にする必要はありません。また、その値が意図された範囲外のプログラムの他の部分と相互作用することを心配する必要もありません (これは i が別のループで再利用された場合に起こるかもしれません)。これによって、コードの追跡と推論が容易になります。

  2. 変数がリソースを保持している場合、そのリソースは今、可能な限り最短の期間だけ保持されます。そして、これは余計な中括弧なしです。また、リソースが if のみに関連していることも明確にされています。モチベーションを上げる例として、次のように考えてみましょう。

    if(std::lock_guard _(mtx); guarded_thing.is_ready()) {
    }
    
    

同僚がその機能を知らないなら、教えてあげましょう! 学びたくないプログラマーをなだめることは、機能を避けるための悪い言い訳です。