Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C / C++(3.5)関数の基礎:宣言・定義・引数を徹底解説

関数は機械のようなものです。機械は入力を受け取り、それを処理して出力を生成します。同様に、関数も値を受け取り、その値に対して何らかの操作を行い、結果を出力します。機械が動き出すには人が手動で入力を与える必要があるように、関数もプログラマーによって呼び出されたときに初めて実行されます。

関数は言語によって呼び名が異なる場合がありますが、次の2つの共通した特徴を持っています。

  • 処理すべき命令文のシーケンス(一連の命令)を含んでいる

  • その命令群は名前で識別され、その名前が関数を参照する

なぜ関数を使うのか?

  • 再利用性 − 同じ機能を複数の場所で使いたい場合、同じ処理を何度も書くのではなく、一度だけ関数を作成して何度でも呼び出せるようにするのが最良の方法です。再利用性は関数が提供する最大の特徴であり、利点でもあります。

  • コードのモジュール化 − main() 関数の中に長いコードを書き連ねる代わりに関数として分割することで、コードは整理され、読みやすく保守しやすいものになります。

  • 修正のしやすさ − 将来的にコードへ変更が必要になった場合も、複数箇所を修正するのではなく、該当する関数内だけを修正すれば済みます。つまり、関数はデータの冗長性を減らす効果もあります。

  • 抽象化の提供 − 関数に適切な名前を付けておけば、内部でどのように実装されているかを知らなくても、その関数が何をするものかを把握できます。たとえば C には「math.h」ヘッダーファイルがあり、pow() 関数など複数の関数が含まれています。この関数の定義がどのように計算しているかを知らなくても、直接呼び出してべき乗の計算ができます。

関数の宣言と定義

関数の宣言とは、コンパイラーに対して関数の戻り値の型と関数名を伝えるプロセスのことです。

構文

本体なし(宣言のみ)

戻り値の型 関数名(引数リスト ※省略可能);

本体あり

戻り値の型 関数名(引数リスト ※省略可能)
{
// 関数の本体
}

各要素の説明

  • return_type(戻り値の型) − 関数が値を返すかどうか、また返す場合はどんなデータ型を返すのかをコンパイラーに伝えます。

void dummy(){
    // 戻り値の型が void なので、呼び出し元に何も返さず、
    // return 文を含みません。
}
int dummy(){
    // 戻り値の型が int なので、整数値を呼び出し元に返します。
    // 整数値を返すため、return 文は必須です。
    return integer_value;
}
float dummy(){
    // 戻り値の型が float なので、浮動小数点値を呼び出し元に返します。
    // 浮動小数点値を返すため、return 文は必須です。
    return float_value;
}
  • 関数名 − 関数名はプログラマーが自由に決められます。上記の例では dummy という名前を付けています。

  • 引数リスト(省略可) − 呼び出し元から渡された値をもとに関数が処理を行う場合には、仮引数を作成する必要があります。

一方、関数の定義には、呼び出されたときに実際に行う処理内容が含まれます。

サンプルコード

#include<iostream>
using namespace std;

// 2つの引数のうち大きい方の値を計算する関数
// 戻り値の型は int
int greatest(int val_1, int val_2){
    // 関数の本体(定義)
    if(val_1 > val_2){
        return val_1;
    }
    else{
        return val_2;
    }
}

int main(){
    int val_1 = 10, val_2 = 20;
    // 関数を呼び出し、返された整数値を変数に格納
    int highest = greatest(val_1, val_2);
    // 最大値を出力
    cout << "The greatest value is : " << highest;
    // main の戻り値の型は int なので、
    // コンパイラーのために return 文が必要
    return 0;
}

実行結果

上記のコードの出力は以下のようになります。

The greatest value is : 20

関数のパラメーター(引数)について

  • 引数は省略可能です。引数がなくても、関数は自身の処理を実行できます。

  • 関数の定義側で宣言され、呼び出し元から渡される値を受け取る変数を「仮引数(パラメーター)」と呼びます。

int greatest(int val_1, int val_2)
  • 呼び出し元が渡す変数や値を「実引数(アーギュメント)」と呼びます。

int highest = greatest(val_1, val_2);
  • 実引数と仮引数の違い

    実引数とは、関数に渡される実際のデータのことです。上記の例では 10 と 20 が実引数に相当します。

    仮引数とは、関数側で受け取るデータのことです。上記の例では val_1 と val_2 が仮引数に相当します。

main() 関数に関する重要ポイント

  • すべてのプログラムには実行開始地点(エントリーポイント)があります。C および C++ では、main() 関数がその役割を担います。

  • main() 関数の戻り値の型が void の場合、コンパイラー(実行環境)へ何も返さないことを意味します。一方、戻り値の型が int の場合には値を返します。たとえば main() 内の「return 0」は、プログラムが正常終了したことを示します。

  • C 言語の場合 − main() 関数の戻り値の型は void または int のみ指定できます。main() は整数値を返すか、あるいは何も返さないかのいずれかだからです。

  • C++ の場合 − main() 関数の戻り値の型は int のみ指定できます。main() は整数値をコンパイラー(実行環境)へ返す仕様になっているためです。

  1. C/C++のスレッド関数とは?pthreadによる並行処理の基本を解説

    このチュートリアルでは、C/C++におけるスレッド関数の基本的な使い方を、実際のサンプルプログラムを通じて解説します。 スレッド関数を利用すると、複数の処理を同時(並行)に実行できます。これらの処理は互いに依存し合っていても、まったく独立していてもどちらでも構いません。POSIXスレッド(pthread)ライブラリを使えば、マルチスレッドプログラミングを手軽に実装できます。 サンプルコード #include <pthread.h> #include <stdio.h> #include <stdlib.h> void* func(void* arg){

  2. C/C++のsystem()関数とは?使い方と実行例を徹底解説

    この記事では、C/C++におけるsystem()関数の基本的な使い方と動作について、具体例を交えながら詳しく解説します。 system()関数は、C/C++標準ライブラリに含まれる関数の一つです。オペレーティングシステムのコマンドプロセッサ(コマンドプロンプト)やターミナルで実行可能なコマンドをプログラムから渡して実行でき、コマンドの処理が完了すると制御をプログラムに戻します。 この関数を使用するには、ヘッダーファイル<stdlib.h>(C++の場合は<cstdlib>)をインクルードする必要があります。 構文 system()関数の構文は以下の通りです。 int