24

このC++コードがVS2010でコンパイルされないのはなぜですか。

for ( int a = 0, short b = 0; a < 10; ++a, ++b ) {}

これはしますが:

short b = 0;
for ( int a = 0; a < 10; ++a, ++b ) {}

forループ初期化子内で異なるタイプの2つの変数を宣言することは禁止されていますか?もしそうなら、どのようにそれを回避できますか?

4

5 に答える 5

43

はい、それは禁止されています。それ以外の場合と同様に、1 つの宣言ステートメントで異なる型の変数を宣言することはできません ( edit : @MrLister が言及する宣言子修飾子をモジュロします)。構造体を宣言できます

for (struct { int a = 0; short b = 0; } d; d.a < 10; ++d.a, ++d.b ) {}

C++03 コード:

for (struct { int a; short b; } d = { 0, 0 }; d.a < 10; ++d.a, ++d.b ) {}

もちろん、すべてが0の場合は、初期化子を完全に省略して= { }.

于 2011-12-27T12:41:22.600 に答える
10

forループとは何の関係もありません。int a = 0, short b = 0;これも、ループの外に書いた場合はコンパイルされません。
したがって、答えは次のとおりです。1 つのステートメントで異なる型の 2 つの変数を宣言することは常に禁止されています。

編集:ああ、ペダンティックのために、同じステートメントで基本型とポインター型、たとえば int と int ポインターを宣言できることを認識しているので、それらは異なる型になります。
うーん、考えさせられます。32 ビット環境では、ポインターは int と同様に 4 バイトになるため、短い a = 0, *b = 0; を使用できます。b を int にキャストします。うーん...

于 2011-12-27T12:42:57.220 に答える
1

禁止されているのは、ステートメントの最後にカンマを付けることです。int a = 0, short ...

この表記法を使用する場合は、両方の変数 muss が同じ型である必要がありますint i = 0, s = 0;

于 2011-12-27T12:51:57.367 に答える
0

for ステートメントで宣言できる型は 1 つだけです。したがって、2 番目のコードは使用可能なコードです。

于 2011-12-27T12:41:48.903 に答える
0

(comprobation ステップ)のwhile条件に変数を宣言することはできません。for

for ( a = 0, short b = 0; a < 10; ++a, ++b ) {}

それはどちらもうまくいきません。

于 2011-12-27T12:42:42.447 に答える