私はこのコードのようなものを書いていました:
do {
int i = 0;
int j = i * 2;
cout<<j;
i++;
} while (j < 100);
( http://codepad.org/n5ym7J5w )
そして、do-while ループの外で変数 'j' が宣言されていないため、変数 'j' を使用できないとコンパイラが私に言ったとき、私は驚きました。
これが不可能な技術的な理由があるかどうか、私はただ興味があります。
私はこのコードのようなものを書いていました:
do {
int i = 0;
int j = i * 2;
cout<<j;
i++;
} while (j < 100);
( http://codepad.org/n5ym7J5w )
そして、do-while ループの外で変数 'j' が宣言されていないため、変数 'j' を使用できないとコンパイラが私に言ったとき、私は驚きました。
これが不可能な技術的な理由があるかどうか、私はただ興味があります。
のスコープは中かっこj内だけです。{}その範囲外のループ条件では使用できません。
C++ ドラフト標準から、私は便利です:
ブロックで宣言された名前は、そのブロックに対してローカルです。その潜在的なスコープは、宣言の時点から始まり、宣言領域の終わりで終わります。
「ブロック」は「複合ステートメント」とも呼ばれ、中かっこで囲まれた一連のステートメント{}です。
これが出来ないのには理由があります。これは、「ステートメントスコープ」の制限によるものです。
変数 i と j は「ローカル スコープ」で宣言されています。つまり、{} ブラケット内の変数です。実際には j を「ステートメントスコープ」で宣言したかったのですが、これは不可能です。
ステートメント スコープは、'for'、'while'、'if'、または 'switch' ステートメントの一部として宣言された変数です。ただし、ステートメントのスコープは do-while ステートメントをカバーしていないため、これを行うことはできません。
基本的に、do-while を使用する言語の欠点を明らかにしました。
言語が提供されている場合は、より良いでしょう:
do {
.
.
.
} while (int j < 100);
しかし、これは提供していません。
double は、予約されていない単語に変更する必要があります (Chad に感謝します)。while 条件で使用するには、do のスコープ外で宣言する必要があります。
int i = 0;
int d = 0;
do{
d = i * 2;
cout << d;
i++;
} while (d < 100);
int j = 0;
for(int i = 0;j < 100;++i){
j = i * 2;
cout<<j;
}
すべてのループセットの前に i = 0; int + for ループとして宣言すると、より適切に機能します