はじめに
前編では、基本的な変数・定数の使い方と、print関数について学びました。
前編での知識が前提となるため、まだ見ていない方はぜひチェックしてみてください😌
C言語 -初級(後編)-
では、後編を見ていきましょう😀
ここからは、より本格的な制御構文について書いていきます。
演算子
前編で紹介していた、+や-といった演算記号のことを、演算子と呼びます。
演算子にも様々な種類があるので、見てみましょう。
演算子の種類 | 記号 |
算術演算子 | +, -, *, /, % |
比較演算子 | >, >=, <, <=, ==, != |
代入演算子 | =, +=, -=, *=, /=, %= |
インクリメント、デクリメント演算子 | ++, –- |
条件演算子 | |, &, !, ||, && |
シフト演算子 | <<, >> |
条件分岐
プログラムは単純な流れ作業だけではありません。
ユーザからの入力や、システムの状態によって挙動を変える必要があります。
ある条件によって処理を変えることができる手法を、2つを紹介します。
if文
if (条件式)
{
}
条件式が成立した場合、{ }内の処理を実行します。
条件式が成立しない場合、{ }は実行しません。
if (条件式1 && 条件式2) //両方が真の場合のみ成立
if (条件式1 || 条件式2) //片方でも真なら成立
条件式は、条件演算子によって複数並べることができます。
if (条件式) {
} else {
}
else文を付けることができます。
条件式が成立した場合、if文内の処理を実行します。
条件式が成立しない場合、else文内の処理を実行します。
if (条件式1) {
} else if (条件式2) {
} else {
}
else文にも条件式を付けることができます。この場合、条件式は上から順番にチェックされます。
条件式1が成立する場合、if文内の処理を実行します。
条件式1が成立せず、条件式2が成立する場合、else if文内の処理を実行します。
条件式1と条件式2のどちらも成立しない場合、else文内の処理を実行します。
else if文は複数段作ることができます。
#include <stdio.h>
int main(void)
{
int a = 10;
if (a < 5) {
printf(“aは5未満\n”);
} else if (a >= 10) {
printf(“aは10以上\n”);
} else {
printf(“aは5未満ない、かつ10以上でない\n”);
}
return 0;
}
結果は「aは10以上」が出力されますね。
switch文
switch(式) {
case 値1:
break;
case 値2:
break;
default:
break;
}
式は、if文とは違い、演算子を指定する必要はありません。
式が持つ値により、どの値の処理を実行するかが決まります。どれにも該当しない場合、default内の処理を実行します。
各値の処理にbreakがありますが、これが無いと直後の処理も実行してしまうため、書くようにしましょう。(続けて処理したい場合は敢えて書かない)
#include <stdio.h>
int main(void)
{
int a = 10;
switch(a) {
case 5:
printf(“aは5\n”);
break;
case 10:
printf(“aは10\n”);
break;
default:
printf(“aはどのcaseにも該当しない\n”);
break;
}
return 0;
}
結果は「aは10」が出力されますね。
繰り返し文
条件が成立する間、処理を繰り返す方法があります。
for文
for (初期化; 継続条件; 変化式)
{
}
主に、繰り返し回数が決まっている場合に使用します。
初期化は、for文の最初の1回だけ実行します。
継続条件が成立する限り、{ }内の処理を繰り返し実行します。
変化式は、主に繰り返し回数として、継続条件のために使用します。
#include <stdio.h>
int main(void)
{
for(int i=0; i<5; i++)
{
printf(“i = %d\n”, i);
}
return 0;
}
変数iを0〜4まで繰り返し、そのときの変数iの値を出力します。
++はインクリメント演算子で、整数型なら1ずつ増加します。
実行結果は以下のようになります。
i = 0
i = 1
i = 2
i = 3
i = 4
while文
while(条件式)
{
}
主に、繰り返し条件が決まっている場合に使用します。
#include <stdio.h>
int main(void)
{
int i = 1;
while(i<10)
{
printf(“i = %d\n”, i);
i = i*2;
}
return 0;
}
変数iは1から始まり、iを2倍した値をiに代入します。
iが10以上の値になったら繰り返し終了です。
結果は以下のようになります。
i = 1
i = 2
i = 4
i = 8
配列
型 変数名[要素数];
同名の変数を、要素数に指定した数だけ作るイメージです。
使用するときは、変数名に[ ]で要素番号を指定します。
要素番号は整数で指定するため、繰り返し文との相性が良いです。
#include <stdio.h>
int main(void)
{
int array[5] = {10,20,30,40,50}; //[0]を10、[1]を20、[2]を30、[3]を40、[4]を50で初期化
for(int i=0; i<5; i++)
{
printf(“array[%d] = %d\n”, i, array[i]); //array[0]〜[4]の値を順番に表示
}
return 0;
}
配列arrayを要素数5で作成しました。この場合、要素番号0〜4の5つが作成されます。
上記サンプルコードでは、array[0]〜[4]を{10,20,30,40,50}で初期化していますが、この初期化は宣言時のみ可能です。
実行結果は以下の通りです。
array[0] = 10
array[1] = 20
array[2] = 30
array[3] = 40
array[4] = 50
以下のように、char型の配列は、文字列を表現するためによく使用されます。
char str[] = “hello”;
printf(“str = %s\n”, str); //helloを画面出力
関数
今までprintf関数を使用していましたが、関数は自分で定義することができます。
戻り値の型 関数名 (引数)
{
}
引数を入力情報として、{ }内で演算を行い、戻り値で返します。
引数は複数指定できます。
#include <stdio.h>
int sumvalue(int n1, int n2); //プロトタイプ宣言
int sumvalue(int n1, int n2)
{
int ret;
ret = n1 + n2; //引数1に引数2を加算
return ret;
}
int main(void)
{
int sv1;
int sv2;
sv1 = sumvalue(1, 2); //1と2をsumvalueで演算した結果をsv1へ代入
sv2 = sumvalue(50, 60); //50と60をsumvalueで演算した結果をsv2へ代入
printf(“sv1 = %d\n”, sv1);
printf(“sv2 = %d\n”, sv2);
return 0;
}
第1引数と第2引数を加算した結果を返す、関数sumvalueを作成しました。
sumvalueの戻り値は、main関数の変数sv1とsv2で受け取ります。
実行結果はこうなります。
sv1 = 3
sv2 = 110
ファイル分割
開発の規模が大きくなってくると、1つのファイルに何万行ものソースコードが書かれることになります。
そんなときは、何らかの単位でファイルを分割したほうが管理しやすくなります。
多くの場合は、機能ごとにファイル分割します。
先ほどのsumvalueの例を、ファイル分割してみます。
function.h
int sumvalue(int n1, int n2); //プロトタイプ宣言
function.c
int sumvalue(int n1, int n2)
{
int ret;
ret = n1 + n2;
return ret;
}
sample1.c
#include <stdio.h>
#include “function.h”
int main(void)
{
int sv1;
int sv2;
sv1 = sumvalue(1, 2); //1と2をsumvalueで演算した結果をsv1へ代入
sv2 = sumvalue(50, 60); //50と60をsumvalueで演算した結果をsv2へ代入
printf(“sv1 = %d\n”, sv1);
printf(“sv2 = %d\n”, sv2);
return 0;
}
sumvalue関数の部分を、functionというファイルに分割しました。
プロトタイプ宣言はヘッダーファイル(.h)に、処理はソースファイル(.c)に入れます。
main関数はsample1.cに残っていますが、この状態だとmain関数からsumvalue関数が何者か判別できなくなるため、function.hをインクルードすることで、sumvalue関数の関数名、戻り値、引数の情報を教えてあげます。
加えて、インストールした拡張機能Code Runnerの設定を変更します。
今のままではVScodeが複数ファイルに対応しておらず、ビルドエラーになってしまうからです。
インストールした拡張機能Code Runnerを右クリックし、設定(赤丸部分)をクリックします。
settings.jsonで編集(赤丸部分)をクリックします。
C言語の設定の行で、$fileName(赤線部分)を、「*.c」に変更します。
上記設定後にCode Runnerで実行すると、結果は以下のようになります。
sv1 = 3
sv2 = 110
さいごに
初級編はこれで終了です。
どれもC言語で必要な機能であり、どのプログラミング言語でも似たような構文になっているので、扱えるようになればいろいろと応用が効きます👍
それでは次回、中級編でお会いしましょう😌
ありがとうございました。
コメント