• ベストアンサー

配列の初期化子 { .......} について

配列の初期化子について、以下のような事がありました。 1. 一般に教科書で言われている事ですが、int a[3]={1} ; で初期化すると a[0]=1,a[1]=0,a[2]=0と初期化子が与えられていない要素は0で初期子されます。 2. 今度は,意地悪く全ての要素に初期化子を与えない a[3]={ } ; で初期化すると a[0]=0.a[1]=0, a[2]=0. と全てが0で初期化されました。←問題点 3. 初期化子を与えない int a[3] ; では a[0] a[1] a[2] は当然ながら不定値で初期化されます。 1と3については教科書通りですが、2についてはどの様に説明する事ができるのでしょうか。 標準Cに規定があるのでしょうか。それとも環境(コンパイラ)によるものでしょうか。尚私はRed Hat Linuxを使っています。 宜しく願います。

質問者が選んだベストアンサー

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

初期化子は、 initializer:     assignment-expression     { initializer-list }     { initializer-list , } initializer-list:     designation(opt) initializer     initializer-list , designation(opt) initializer ですので、少なくともひとつは式が必要です。 式が何も無い場合は未定義の動作になります。

PHYOPHYO
質問者

お礼

ひととうりC言語を終わり、更にステップアップをめざしていますが、その時基礎を徹底的にやり直そうとしている段階です。 いつもご回答有難うございます。

PHYOPHYO
質問者

補足

いつもご回答有難うございます。再質問ですが initializer-list:     designation(opt) initializer     initializer-list , designation(opt) initializer の部分が解りません。designation(opt) initializerがオプションならば少なくともひとつは式が必要という結論が何処から出たのか理解できません。ご教授くだされば幸いです。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.4

> designation(opt) initializerがオプションならば designationだけがオプションであって、 initializerには(opt)が付いていないので必須、 じゃないのでしょうか。

全文を見る
すると、全ての回答が全文表示されます。
  • php504
  • ベストアンサー率42% (926/2160)
回答No.2

int a[3] = {}; Borland C compilerでやったらエラーになりました 式が必要だそうです。 環境依存ですね。

全文を見る
すると、全ての回答が全文表示されます。
  • phoenix343
  • ベストアンサー率15% (296/1946)
回答No.1

動作規定に何もないのだから、そのコンパイラの解析処理の結果でしょう。数値文字列をどうやって数値に変換するか想像してみれば分かるのでは?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 配列の要素数を超えた参照のコンパイル

    C言語においては”配列の要素数を超えての参照もコンパイルエラーにはならない”という事がいえます。 例えば int a[10]={1}; とした時、a[-1] a[11]を参照しても、コンパイルエラーにはなりません。不定値が表示されるか、Red Hat Linuxに関しては”セグメンテーション違反です”とでるだけです。 しかし、わたしはCしか学んではいませんので解りませんが、配列の要素数を超えての参照はコンパイルエラーになる言語もあるのではないかと思います。 C言語はよく”暴走する言語”と言われます。規制をできる限り排除して軽くし、ミスはプログラマが取るという意味に考えています。 ”C言語においては配列の要素数を超えての参照もコンパイルエラーにはならないという事”はC言語のその様な設計思想に基ずいた仕様なのでしょうか。 それとも、違う考えに基ずいて、”配列の要素数を超えての参照もコンパイルエラーにはならない”という事に成っているのでしょうか。 宜しく願います。

  • registerと配列

    ある本に以下のような書き出しでプログラムが載っています。 >register付きで宣言された配列の先頭要素の値を表示(動作しない)< #include<stdio.h> int main(void) { register int x[5]; printf("x[0]の値は%dです。\n",x[0]); return 0; } 配列はコンパイルする段階で*(a+0)とポインタに変換されるとは理解しているのですが、私の環境(Red Hat Linux)では動作してしまいます。 さすがに、 printf("&x[0]の値は%pです。\n",&x[0]);とすると>registerにかかわらずポインタの値を求めています<という警告がでますが、 本では>動作しない<と書かれていますが、きちんとコンパイルも行われ>動作します< これはどの様に考えたらよいのでしょうか?宜しく願います。

  • 【C言語】配列の中に配列を入れたい

    const double A[2] = {1.0, 2.0}; double B[2][3] = { { A[0], A[1], 0.0 }, { 0.0, 0.0, 0.0 }}; このようなプログラムをコンパイルしようとすると、 初期化子の要素が定数ではありません というエラーが出てしまい困っています。どのように解決したらいいでしょうか。 OSはlinux、コンパイラgccです。

  • 配列の初期化に関する質問です

    配列を初めにAB[10]={0,1,・・・・,0}のように宣言すればちゃんと動くのですが, int l_AB=10; としてからAB[l_AB]={0,1,・・・・,0}とすると「配列初期化子内の要素が多すぎます」となりコンパイルできません。自分には何が違うのかよくわかりません。出来ないのが普通なのでしょうか? #include<stdio.h> #include<stdlib.h> int main() { int l_AB = 10; int AB[l_AB]={0,1,1,1,1,0,1,1,1,0}; int i=0; for(i=0;i<l_AB;i++){ printf("%d",AB[i]); } }

  • 配列の初期化

    java初心者です 配列の初期化についてなのですが、たとえば String[] name = {"A","B","C","D","E","F","G","H","I","J"}; int[] age = {12,18,25,18,20,32,22,15,30,37,29,24}; とありこれを10代/20代/30代に分けるとして int[] age10 = new int[?]; int[] age20 = new int[?]; int[] age30 = new int[?]; と宣言したいのですが、?にはなにを入れればいいのでしょうか? int[] ageのところから自分で数えて4/5/3と入れるのは無しです。 お手数ですがアドバイスや解説おねがいしますm(_ _)m

    • ベストアンサー
    • Java
  • 配列の初期化に関する問題で・・・

    Javaのプログラミングの問題で、下記のような問題が出ました。 要素数が10のint型配列aの各要素を順に3,12,7,20,15,5,8,18,10,16で初期化し、 キーボードから入力された値が配列の何番目に格納されているかを表示するプログラムを作成してください。 ただし、データが配列の中に存在しない場合は「○○は見つかりませんでした」と表示してください。 「if文を使って場合分けする」というヒントがありましたが よくわかりません。 下記のように考えてみたのですが、思うようになりません。 教えて頂けたらと思います。 import java.io.*; public class renshu { public static void main(String[] args)throws IOException { int a[]={3,12,7,20,15,5,8,18,10,16}; int n; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.print("探索する数字を入力してください>"); n=Integer.parseInt(br.readLine()); a=Integer.parseInt(br.readLine()); switch(a){ case 3: System.out.print(a+"はa[1]に格納されています。"); break; case 12: System.out.print(a+"はa[2]に格納されています。"); break; case 7: ~~~~~(省略) break; default; System.out.print(a+"は見つかりませんでした。") } } }

    • ベストアンサー
    • Java
  • C♯の配列について

    C♯でプログラムを作っているのですが、配列の要素数の最大値と最小値の求め方がわかりません。配列の値の最大値の求め方は調べれば出てくるのですが、要素数の最大値等は調べてもわかりませんでした。 例えば下記のような配列があった場合 int[,,] a =new int[100,100,100] a[2,3,6]=1 a[4,5,9]=1 a[13,46,79]=1 a[8,15,45]=1 a[1,33,68]=1 それぞれの要素数の最小値1、3、6、最大値13、46、79は どのようにプログラムで求めればいいのでしょうか? よろしくお願いします。

  • 配列

    public void test(int[] x){ ... } というメソッドに配列を渡したいとき、 test(new int[5]); は可能ですが、 int[] a = {0,1,2,1,0} という書式が可能なことから、 test( {0,1,2,1,0} ); としてみたのですが、コンパイルでひっかかります。 {}による配列生成は初期化のみに限定されているのでしょうか。 値の入った配列をこのtestに入れてやりたい場合は、 int[] a = {0,1,2,1,0}; test(a); としていかないといけないのでしょうか。

    • ベストアンサー
    • Java
  • 関数から配列を返すには?

    return で配列を返すにはどうしたらよいのでしょうか。 例えば以下のような場合です。 int main (){ char Value[] = "999"; int a;  a = test(Value);  printf ("%d", a);   } int test(char *Value) { int nVal[255]; ここで nVal に適当な処理をして・・・  return Value; }  int a を配列とかにしてみましたけど、コンパイラが 通りません。 要は配列数値を main で受け取って表示したいのですが、 本日C言語はじめたところなので、教えていただければありががたいです。

  • 二次元配列の初期化の方法。

    java初心者です。 二次元配列(9×9)の要素すべてに同じ値で初期化したいのですが、どういった方法があるのでしょう? {{0,0,0,0,0,0,0,0,0,},{0,0,・・・ という方法しか分からないのですが、やたらと大変だなぁと思ったのですが・・・ よろしくお願いします。

    • ベストアンサー
    • Java