おぼえがき

過ちては則ち改むるにうんぬんかんぬん

変数宣言と初期化について(C言語)

f:id:feci:20210810151051j:plain

C11

 

C11の変数宣言と初期化について。

#include <stdio.h>

void main() {

  //①変数の宣言と初期化を別でおこなうパターン
  int aaa;
  aaa = 10 + 5;


  //②変数の宣言と初期化を同時におこなうパターン
  int bbb = 10 + 5;


  //③同時に2つ以上の変数を宣言するパターン(初期化は別)
  char ccc, ddd[6];
  ccc = 'a';
  ddd = "aiueo"//このパターンではこの記述では配列(文字列)は代入不可(error)


  //④変数を宣言しつつchar配列(文字列)を代入するパターン
  char ddd[6]; //配列の値の数+1の整数をブラケット内に入力
  ddd[0] = 'a';
  ddd[1] = 'i';
  ddd[2] = 'u';
  ddd[3] = 'e';
  ddd[4] = 'o';
  ddd[5] = '\0'//char配列の最後には必ずNULLのエスケープシーケンスを入れる

  //⑤同時に2つ以上の変数を宣言しつつ初期化するパターン
  char eee='k', fff=
"kakikukeko"//変数宣言時にのみで配列(文字列)を代入できる


  printf("%d%d\n", aaa, bbb); //15
  printf("%c%s\n", ccc, ddd); //③はerror・④はaとaiueo
  printf("%c%s\n", eee, fff); //kとkakikukeko

}

Cではデータ型を指定して変数宣言をおこないます。

変数を宣言したあとの最初の値を代入することを、C言語では「変数の初期化」と言います。

 

①は変数aaaを宣言したけれども、初期化(値の代入)はしていないパターンです。

②は変数bbbを初期化しつつ、初期化もいっしょにおこなっているパターンです。

 

ちなみに、もし初期化をしていない変数をなんらかの関数処理などで使用した場合は、その変数の値が参照された時点でプログラムがエラーを吐きます。

 

 

③のパターンのように、同時に2つ以上の変数を宣言をすることもできます。

しかしこのパターンで宣言した変数には、変数名[3]="aiu" の形式でchar型の値を配列として代入することはできません。

 

変数の宣言時に初期化をしなかった場合に文字列を変数に代入するには、④のような記述を用いる必要があります。

Cには文字列型というデータ型は存在しませんので、文字列はchar型の配列としてあつかわれるようです。

なのでこのときの値を囲う記号は、ダブルクオーテーションではなくシングルクオーテーションとなります。

 

またchar型の配列では、配列の末尾の値は必ずNULLになるというルールがあります。

なのでaiueoと5文字の配列を作りたい場合は、変数名のブラケットの中に5+1で6という整数を記入し、そのまま④のように記述していきます。

 

なお、⑤のパターンのように変数の宣言と初期化を同時に処理する場合は、例外的に「変数名 = "文字列";」の記述で変数にchar型の配列を代入することができます。

 

 

ちなみに変数宣言を記述する位置は、メイン関数のブレイス(波括弧)内の先頭部分と決まっています。

もしprintfなどのなんらかの処理をおこなったあとに変数宣言をすると、性能の悪いコンパイラなどではプログラムがエラーを吐く可能性があります。

 

 

あと変数名についてですが、Cの変数名には半角大文字小文字の英字、半角数字、半角アンダースコアが使えます。

ただし、変数名の頭に半角数字を使うことはできません。

数字は変数名の2文字目以降にしか使えない仕様になっています。

 

変数名に大文字の半角英字が使えると書きましたが、通常の変数名は小文字の英字を使うのがプログラマーの慣例的には好ましいようです。

 

あと当たり前ですが、変数名にC言語の予約語を使うことはできません。

つまり変数名に、intやforやifなどのC言語的にすでに特定の役割を持っている文字列を使うことはできません。

 

 

以上です。