18

C++ では、次のように if ステートメントで変数を初期化できます。

if (CThing* pThing = GetThing())
{
}

なぜこのスタイルが悪い、または良いと考えるのでしょうか? 利点と欠点は何ですか?

pThing 変数のスコープを制限し、NULL のときに誤って使用されることがないため、個人的にはこのスタイルが気に入っています。ただし、これができないのは好きではありません。

if (CThing* pThing = GetThing() && pThing->IsReallySomeThing())
{
}

上記の作業を行う方法があれば、投稿してください。しかし、それが不可能な場合でも、その理由を知りたいです。

ここから借りた質問、同様のトピックですが、PHP.

4

12 に答える 12

20

重要なことは、C++ の宣言は式ではないということです。

bool a = (CThing* pThing = GetThing()); // not legit!!

if ステートメントで宣言とブール論理の両方を実行することはできません。C++ 言語仕様では、式または宣言のいずれかを明確に許可しています。

if(A *a = new A)
{
    // this is legit and a is scoped here
}

ある項と別の項の間で a が定義されているかどうかをどうやって知ることができますか?

if((A *a = new A) && a->test())
{
    // was a really declared before a->test?
}

弾丸を噛み、内部ifを使用します。スコープ ルールは便利で、ロジックは明示的です。

if (CThing* pThing = GetThing())
{
    if(pThing->IsReallySomeThing())
    {
    }
}
于 2008-09-25T22:52:00.887 に答える
4

利点について:

変数は、1 行前ではなく、最初に必要になったときに定義することを常にお勧めします。これはコードの可読性を向上させるためのものです。なぜなら、CThing が定義されている場所をスクロールしたり検索したりしなくても、CThing が何であるかを知ることができるからです。

また、スコープを loop/if ブロックに縮小すると、コード ブロックの実行後に変数が参照されなくなり、ガベージ コレクションの候補になります (言語がこの機能をサポートしている場合)。

于 2008-09-25T22:34:49.523 に答える
3
if (CThing* pThing = GetThing())

内部でブール式を提供していないため、スタイルが悪いです。ifを提供していCThing*ます。

CThing* pThing = GetThing();
if (pThing != NULL)

これはいいスタイルです。

于 2010-01-20T16:31:07.637 に答える
2

これは、短絡評価をサポートしていも、C++ では機能しないはずです。 たぶん、次のことを試さないでください。

if ((CThing* pThing = GetThing()) && (pThing->IsReallySomeThing()))
{
}

エラー.. Wesley Tarleの回答を参照してください

于 2008-09-25T22:27:09.387 に答える
2

参考までに、一部の古い Microsoft C++ コンパイラ (Visual Studios 6、および .NET 2003 だと思います) は、場合によってはスコープ規則に完全に従っていません。

for(int i = 0; i > 20; i++) {
     // some code
}

cout << i << endl;

私は範囲外である必要がありますが、それは有効なコードでした/です。私はそれが機能として演じられたと信じていますが、私の意見では、それは単なる非準拠です. 基準を守らないのは悪いことです。IE と Firefox に関する Web 開発者として。

VSを使用している人は、それがまだ有効かどうかを確認できますか?

于 2008-09-25T22:39:18.017 に答える
2

私が通常それを行わない理由の 1 つは、条件付きテストで「=」を見逃すことによる一般的なバグのためです。エラー/警告を設定してlintを使用して、それらをキャッチします。次に、条件内のすべての割り当てについて叫びます。

于 2008-09-25T22:33:21.680 に答える
0

これは許容できる優れたコーディング手法です。ただし、低レベルのコーディングのバックグラウンドを持っていない人はおそらく同意しないでしょう。

于 2008-09-25T23:00:01.507 に答える
0

また、C++ コードを作成している場合は、条件ステートメント (宣言の一部ではない) の "=" に関するコンパイラの警告をエラーにする必要があることにも注意してください。

于 2008-09-25T22:57:07.363 に答える
0

割り当てを余分な ( ) のセットで囲んで、警告メッセージを回避することもできます。

于 2008-09-25T22:39:45.317 に答える
0

私はそれが一種の危険だと思います。以下のコードははるかに安全であり、中かっこで囲まれているため、pThing のスコープが希望どおりに制限されます。

GetThing() が NULL を返すことがあると想定しているため、if() ステートメントに面白い句を入れました。IsReallySomething() が NULL ポインターで呼び出されるのを防ぎます。

{
    CThing *pThing = GetThing();
    if(pThing ? pThing->IsReallySomeThing() : false)
    {
    // Do whatever
    }
}
于 2008-09-25T22:42:40.270 に答える