• ベストアンサー

int i, int i[1];

C++で、  int i; と、  int i[1]; は、どっちで宣言をしても、iは同じ振るまいですか?

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

  • ベストアンサー
  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.4

配列、ポインタなどよりももっと基礎的な概念である「右辺値」、「左辺値」を理解しましょう。 int i ; この形で宣言されたiは代入式の右辺(代入する値)にも左辺(代入される領域)にも使うことが出来ます。 int a ; a = i ; i = 10 ; C言語でも他のほとんどの言語でも「変数は右辺の時と左辺の時とでは解釈が違う」という原則があります。 代入式の右辺に配置出来るのは『値』です。 変数であっても良いし定数であっても、式であってもかまいません。 左辺がポインタ変数の場合は右辺はアドレス値(またはアドレス式)です。 代入式の右に配置可能な値を右辺値といいます。 代入式の左に配置出来るのは『領域』です。 変数であっても良いし、配列要素でもかまいません。 また、領域を示す式(int i[1]のときの*iなど)でもかまいません。 配列名(int i[1]のときのi)や定数は領域を持たないため、左辺に配置することが出来ません。 代入式の左に配置可能な領域を左辺値といいます。 int i[1] ; この形で宣言されたiは右辺値に利用できます。 int *a ; a = i ; しかし、iだけでは領域を持たないため左辺値になりえません。 i = 1 ; //コンパイルエラーが出る。 コンパイル時に「有効な左辺値でない」と言う意味のエラーが出るのは「領域を示さない値を左辺値として使っている時」です。 どちらかと言うと「基礎理論」の部類なのでプログラム言語の本などには書いてないのですが、実は最も大切なのが「基礎理論」です。 頑張って勉強してください。

yuyata
質問者

お礼

右辺値と左辺値、それから、配列はポインタであることと、変数の領域についてのことが勉強になりました。 ありがとうございました。

その他の回答 (5)

  • fruipa
  • ベストアンサー率38% (14/36)
回答No.6

前者のiは単純変数、 後者のiは配列の先頭アドレス です。 当然振る舞いは違います。 前者 int i; int a; int *b; a=i; b=&i; 後者 int i[1]; int a; int *b; a=i[0]; b=i; b=&i[0]; となります。

  • jmh
  • ベストアンサー率23% (71/304)
回答No.5

違います。←回答。 感想→でも、コンパイルして、出来上がるマシン語は、もしかしたら、同じになる(こともある)かもしれないですね。

yuyata
質問者

お礼

ありがとうございました。

  • MovingWalk
  • ベストアンサー率43% (2233/5098)
回答No.3

配列とかポインタが理解できていないようですね。 http://homepage1.nifty.com/toshio-k/prog/c/array.html

  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.2

違います。 「int型の領域1個が確保される」ことは同じですが、 それにアクセスするとき、 前者は「i」だけで使えるけど、 後者の宣言をした場合「i[0]」として使わないといけません。 後者の宣言をしてただ「i」と書いた場合、配列iの先頭のアドレスが 得られます。 また代入はできません。 型としても違います。前者の「i」はint型なのに対し、 後者の「i」は「intの配列型」です。

yuyata
質問者

お礼

ありがとうございました。

  • cherry3
  • ベストアンサー率39% (18/46)
回答No.1

int iで宣言したほうはそのまま そのままi=0などのように使えますが、 int i[1]で宣言したほうは i[0]=0 や *i=0 のように記述しないと使えませんよ。

yuyata
質問者

お礼

ありがとうございました。

関連するQ&A