ちんあなごのプログラミング学習帳

プログラミング勉強したての赤子

MENU

気まぐれC言語 めも

最近組み込みエンジニアが気になってきました。かなり勉強大変そうだけど…。
理由はSFに出てくる機械が好きだから。産業ロボにはロマンが詰まっている。
向いてるか向いていないかは置いといて、そっちも少し勉強してみようと思います。

ちなみに最近ハマったSFアニメはネッフリ限定の「サイバーパンクエッジランナーズ」という神鬱アニメです。大好きだけどラスト見返したくない。

今回はC言語について調べたことをメモしていきます。

※(1/27~)ぼちぼちと追記していきます

C言語とは

ハードウェアへの組み込みや開発に強い言語。
手続き型言語と呼ばれており、 コンピューターへの命令(手続き)を実行する順番に記述していくのが基本。 他のプログラミング言語の基礎になっている。

OS開発からアプリケーション、スマホアプリ、組み込み制御機器、車載機器、IoTやAI、ロボットの制御、人工衛星や宇宙ステーションの制御などにも使用されている。
UNIXLinuxRubyPythonC言語で作られている。

C言語の長所】
実行環境に縛られず同じコードを異なる環境でコンパイルして使用できる。
プログラミングの実行速度が速い。

C++C#との違い

C言語オブジェクト指向の概念

ゲームエンジンUnreal Engine」はC++で作られている. Unreal Engineで作られたゲームはFINAL FANTASY Ⅶ REMAKE等。

C言語JavaC++

Javaと同じく「ガベージコレクション」を使える
ゲームエンジン「Unity」はC#で作られている。

ガベージコレクション
プログラムが確保したメモリ領域のうち、不要になった箇所だけを解放してくれる機能 つまり掃除のおば


C言語の文法

#include <stdio.h>
int main(void){
  printf("hello!\n");   //文字を表示
  printf("hello!\n");
  /*printf("hello!\n"); */ // [/*]と[*/]で囲むとコメントアウト
  return 0;
}
//出力結果
hello!
hello!
  • #include <ヘッダファイル名> ▶️ include文
    (プログラムを実行可能な形にするための決まり文句)
  • int main(void) ▶️ メイン関数
    (プログラムの開始位置を指定する関数)
  • 波括弧{ }の中に本文(命令)を書く
  • return 0; ▶︎ プログラム処理の終了の合図。省略可
  • \n ▶️ 改行
    (本によっては¥nと記載があるがコンパイル後に反映されない可能性有)

ちなみに、別の動画でメイン関数のことをvoid main()と書いていたので真似してみたらコンパイルできませんでした。

qiita.com



コンパイルのざっくりとした流れ

  1. ターミナルでプログラムコードが保存してあるディレクトリにcdコマンド等を使って移動
  2. プログラムのコンパイル gcc [ファイル名](ex gcc hello.c)
    (コンパイルが正しくできていれば同フォルダに a.out という名前の実行可能ファイルが作成できている).
  3. 実行可能ファイルの実行 ./a.out


変換指定子

C言語のprintf()、fprintf()、sprintf()、scanf()、fscanf()、sscanf()などの関数で使用する記述子。 変数に代入されている文字や数字を使用する際にどのように変換するかを指定するためのもの。

入力フォーマット指定子と出力フォーマット指定子の二つあるが、下のものは両方で使える。

変換指定子 対応する型 意味
%c char 一文字だけ入力or出力
%s char(配列) 文字列を入力or出力
%d int 整数を10進数として入力or出力
なんでintなのにdやねん
%f float double 値を通常の小数表現で出力 (例:12.566371)。


変換指定子の使用例
#include <stdio.h>
 
int main(void)
{
 
  /* 文字列 */
  printf("%s\n", "Hello!");   //Hello!
 
  /* 整数 */
  int a = 1234;  
  printf("%d\n", a);  //1234
 
  /* 実数 */
  float b = 3.1415926535;
  printf("%f\n", b); //3.141593
}

C言語の足し算引き算

今回はprintf関数と先ほど書いた変換指定子を数値の代入のために使用。

#include <stdio.h>

int main(void)
{
    printf("%d + %d = %d\n",5,2,5+2);               /* 足し算*/
    printf("%d - %d = %d\n",5,2,5-2);               /* 引き算 */
    printf("%d * %d = %d\n",5,2,5*2);               /* 掛け算 */
    printf("%d / %d = %d 余り %d \n",5,2,5/2, 5 % 2);  /* 割り算*/  
}

/*
(計算結果)
5 + 2 = 7
5 - 2 = 3
5 * 2 = 10
5 / 2 = 2 余り 1
*/

変数の値を出力する場合には「標準出力の書式」の後ろにカンマ「,」をつけて、「式や変数」を続けて記載する。

printf("標準出力の書式", 式や変数);


式や変数が複数ある場合はカンマ「,」で区切ることで、「式や変数」を複数並べることが可能。

printf("標準出力の書式", 式や変数1, 式や変数2, 式や変数3);

ちなみに、式は「オペランド」と「演算子」から構成されてる。 例えば、「2 + 3」という式がある場合、
式内の「+」のような演算の内容を表すものを「演算子」と呼び。
また、式内の2、3のように演算に使われるものを「オペランド(演算対象)」と呼ぶ。

今回は値のみだが、変数もオペランドに当てはまる。
オペランドについては下のURLがわかりやすいです。

wa3.i-3-i.info

if文、while文、for文など

Rubyを勉強していた時はif文さえ知っていれば生きていけた。
どうやらdo whileはRubyにはないらしい。

  • if文
    条件式内の条件を満たす場合、if文内に記述された処理を実行する
  • for文
    for (初期化;条件式;変化式) 
    指定された回数だけ処理を繰り返す
  • while文
    繰り返す回数が決まっておらず、条件を満たしている間は処理を繰り返す
    条件を満たさない場合、一度も実行されない場合がある
  • do while文
    与えられた条件を満たしている場合に処理を繰り返す。
    条件式を満たしているかは処理の実行後に判断。最低でも一度は必ず処理が実行される。


if文

if(a > b)
{
  printf・・・;
}

for文

for(a=0; a<b; a++)
{
  printf・・・;
}

while文

while(a<b){
  printf・・・;
  a++;
}

do while文

do{  
  printf・・・;
  a++;
} while(a<b);



プロトタイプ宣言

通常、C言語では関数を呼び出す場合には、main関数よりも前に関数の定義を書く必要がある。
理由は、main関数よりも後に関数の定義をしてしまうとコンパイルエラーになってしまうからである。
しかし、関数が増えてくるとこれらの呼び出し順番を管理するのがめんどくさくなる。

そこで、役立つのがプロトタイプ宣言という構文である。
関数の中身(処理)を記述せずに。とりあえず関数を呼び出す前に宣言しておいて、 処理の部分は後ほど記述するという方法である。

プロトタイプ宣言の記述方法は、下の通り。

戻り値の型 関数名(引数の型);

※{}では締めず、セミコロンで終わらせることに注意。

例えば、

void func(int a)
と書いておけば、「int型の引数を一つ持ち、戻り値がないfuncという名前の関数がある」ということがコンパイラに伝わるため、関数の定義をmain関数よりも後ろに書くことができるようになる。
上記のaのような仮引数はなくても構わないが、通常は変数名を入れることが多い。

グローバル変数とローカル変数

プログラム全体の、複数の関数から使用できる変数のこと
使用の際は関数の外側で宣言する。

ローカル変数

ひとつの関数内でのみ使用できる変数のこと
関数内で宣言する。

Copyright ©エンジニアを目指すちんあなご All rights reserved.