test1
次の例では、2 つの構造体とを使用してこれを示していtest2
ます。最初の構造体には 2 つの要素 (サイズ 2 の整数配列) と浮動小数点数要素があります。
test1の2 つの構造体変数s1とs2を次のように初期化します。
s1={{23,52},2.5},s2={21,19,3.6};
s2の場合でも、配列要素を囲む中括弧を取り出しても、両方とも正常に動作します。警告なしで正常に動作し、出力は正しいです。しかし、次のようにtest2の 2 つの変数を初期化すると、次のようになります。
v1={{23,52},2.5},v2={21,19,3.6};
v1の値を出力しようとすると、間違った出力が表示されます。これらは、コンパイル時に表示された警告です。
warning: braces around scalar initializer|
warning: (near initialization for 'v1.list1')|
warning: excess elements in scalar initializer|
warning: (near initialization for 'v1.list1')|
||=== Build finished: 0 errors, 4 warnings ===|
この前提に基づいて、以下の疑問を解消してください。
質問:最初の 2 つの数値が構造体の別個の整数要素であるか、構造体の整数配列要素の一部であるかについてコンパイラーを混乱させるv1={{23,52},2.5}
代わりにs2には、 2 つの要素 (サイズ 2 の 1 つの整数配列と float) ではなく、 3 つの要素 (2 つの整数要素と 1 つの float) がありますか?私が特に理解したいのは、v1の初期化に関する最初のケースが間違っている理由です。v1={23,52,2.5}
s2={21,19,3.6}
s2={{21,19},3.6}
#include<stdio.h>
struct test1{
int list[2];
float rate;
}s1={{23,52},2.5},s2={21,19,3.6}; //Works fine
struct test2{
int list1;
int list2;
float rate;
}v1={{23,52},2.5},v2={21,19,3.6}; //Messes things up
int main(void)
{
printf("%d,%d,%f\n",s1.list[1],s2.list[1],s2.rate);
printf("%d,%d,%f\n",v1.list1,v1.list2,v1.rate);
}