この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つの変数を宣言することは禁止されていますか?もしそうなら、どのようにそれを回避できますか?
この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つの変数を宣言することは禁止されていますか?もしそうなら、どのようにそれを回避できますか?
はい、それは禁止されています。それ以外の場合と同様に、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
の場合は、初期化子を完全に省略して= { }
.
for
ループとは何の関係もありません。int a = 0, short b = 0;
これも、ループの外に書いた場合はコンパイルされません。
したがって、答えは次のとおりです。1 つのステートメントで異なる型の 2 つの変数を宣言することは常に禁止されています。
編集:ああ、ペダンティックのために、同じステートメントで基本型とポインター型、たとえば int と int ポインターを宣言できることを認識しているので、それらは異なる型になります。
うーん、考えさせられます。32 ビット環境では、ポインターは int と同様に 4 バイトになるため、短い a = 0, *b = 0; を使用できます。b を int にキャストします。うーん...
禁止されているのは、ステートメントの最後にカンマを付けることです。int a = 0, short ...
この表記法を使用する場合は、両方の変数 muss が同じ型である必要がありますint i = 0, s = 0;
for ステートメントで宣言できる型は 1 つだけです。したがって、2 番目のコードは使用可能なコードです。
(comprobation ステップ)のwhile
条件に変数を宣言することはできません。for
for ( a = 0, short b = 0; a < 10; ++a, ++b ) {}
それはどちらもうまくいきません。