15

私はこのコードのようなものを書いていました:

do {
    int i = 0;
    int j = i * 2;
    cout<<j;

    i++;
} while (j < 100);

( http://codepad.org/n5ym7J5w )

そして、do-while ループの外で変数 'j' が宣言されていないため、変数 'j' を使用できないとコンパイラが私に言ったとき、私は驚きました。

これが不可能な技術的な理由があるかどうか、私はただ興味があります。

4

5 に答える 5

12

のスコープは中かっこj内だけです。{}その範囲外のループ条件では使用できません。

C++ ドラフト標準から、私は便利です:

ブロックで宣言された名前は、そのブロックに対してローカルです。その潜在的なスコープは、宣言の時点から始まり、宣言領域の終わりで終わります。

「ブロック」は「複合ステートメント」とも呼ばれ、中かっこで囲まれた一連のステートメント{}です。

于 2013-08-30T20:54:37.293 に答える
7

これが出来ないのには理由があります。これは、「ステートメントスコープ」の制限によるものです。

変数 i と j は「ローカル スコープ」で宣言されています。つまり、{} ブラケット内の変数です。実際には j を「ステートメントスコープ」で宣言したかったのですが、これは不可能です。

ステートメント スコープは、'for'、'while'、'if'、または 'switch' ステートメントの一部として宣言された変数です。ただし、ステートメントのスコープは do-while ステートメントをカバーしていないため、これを行うことはできません。

基本的に、do-while を使用する言語の欠点を明らかにしました。

言語が提供されている場合は、より良いでしょう:

do {
.
.
.
} while (int j < 100);

しかし、これは提供していません。

于 2013-08-30T21:23:51.207 に答える
0

double は、予約されていない単語に変更する必要があります (Chad に感謝します)。while 条件で使用するには、do のスコープ外で宣言する必要があります。

int i = 0;
int d = 0;
do{
    d = i * 2;
    cout << d;
    i++;
} while (d < 100);
于 2013-08-30T20:58:11.903 に答える
0
  • do ループの構文は do{ } です。{ } 内の変数宣言は、このスコープ内にのみ存在します。したがって、j のスコープは、このスコープ内で宣言されているため、do{ } 内のみです。このスコープ内でのみ呼び出しまたは参照できます。
  • このスコープ外の j にアクセスする場合は、j をグローバル変数として宣言する必要があります。j の宣言をこのスコープ外に移動します。
于 2013-08-30T22:31:36.693 に答える
-1
int j = 0;
for(int i = 0;j < 100;++i){
j = i * 2;
cout<<j;
}

すべてのループセットの前に i = 0; int + for ループとして宣言すると、より適切に機能します

于 2013-08-30T20:56:47.670 に答える