35

多くの場合、このようなループが必要です

do
{
     Type value(GetCurrentValue());
     Process(value);
}while(condition(value));

valueのスコープは で終了するため、残念ながらこれはコンパイルされません}。つまり、ループの外で宣言する必要があります。

Type value;
do
{
    value = GetCurrentValue(); 
    Process(value);
}while(condition(value));

私は少なくとも 2 つの理由でこれが好きではありません。1 つには、ローカルで宣言するのが好きです。そして第二に、値が代入可能またはデフォルト構築可能ではなく、コピー構築可能のみである場合、これは問題です。

したがって、私の質問には 2 つの側面があります。まず、do while のスコープを最終条件に拡張する際に特定の理由/問題があったかどうかを知りたいです (for ループで宣言された変数のスコープに for ループの本体が含まれているのと同じように、物理的には中かっこの外側)。そして、私の最初の質問への答えが「それはまさにその通りです。なぜという質問をしないでください」だと思うなら。それから、私の例にあるものと同様の do-while ループを書くのに役立つイディオムがあるかどうかを知りたいのですが、私が言及した欠点はありません。

質問が明確であることを願っています。

4

2 に答える 2

24

valuewhile ループのスコープをローカルに保ちたい場合は、代わりに次のようにします。

do
{
     Type value(GetCurrentValue());
     Process(value);
     if (! condition(value) )
         break;
} while(true);

これは単なる個人的な好みですがwhile、次のように構造化されたループがより読みやすいことがわかります (whileではなくdo-while):

while(true) {
    Type value(GetCurrentValue());
    Process(value);
    if (! condition(value) ) {
        break;
    }
}

C/C++ のスコープ規則は次のように機能します。ブレース{...}ブロック内で宣言されたローカル変数は、そのブロックに対してのみローカル/可視です。例えば:

int a = 1;
int b = 2; 
{
    int c = 3;
}
std::cout << a;
std::cout << b;
std::cout << c;

c宣言されていないと不平を言うでしょう。

論理的根拠については、一貫性の問題であり、「それが言語の定義方法です」

于 2012-11-08T20:30:02.727 に答える