長いプログラムは内容の把握が難しくなります。機能や処理を分割することで見通しをよくすることができます。
この分割された機能を言語によりいろいろな呼び方をします。サブルーチンとかあまり使われない訳語として副プログラムとか、ファンクション、メソッドなどです。さらに言語によっては値を返すものと作業をするだけのものと別の名前で呼ぶものがあります。C言語では「関数」しかありません。名前は値を返すような名前ですが、作業するだけでも何かを返しているからです。
基本形です。[ ]は省略可能をあらわします。
[返り値の型] 関数名( 型 引数 [,型 引数...] ){ 文 ... }
具体例です。2つの整数値を受け取って和を返す関数です。
int wa(int x,int y){ int s; s = x + y; return s; }
1: /* 関数の定義の基本形 k0701.c */ 2: #include <stdio.h> 3: 4: int wa(int x,int y){ 5: int s; 6: s = x + y; 7: return s; 8: } 9: 10: int main() 11: { 12: int a=100; 13: int b=20; 14: int c = wa(a,50+b); 15: printf("%d\n",c); 16: return 0; 17: }
wa()
main()
実行結果はこうなります。
~/c$ ./k0701 170
k0701.cに比べて色のついた部分が異なっています。
1: /* 戻り値を使わない関数の呼び方 k0702.c */ 2: #include <stdio.h> 3: 4: int wa(int x,int y){ 5: int s; 6: s = x + y; 7: printf("%d\n",s); 8: return s; 9: } 10: 11: int main() 12: { 13: int a=100; 14: int b=20; 15: wa(a,50+b); 16: /* printf("%d\n",c); */ 17: return 0; 18: }
printf("%d\n",s);
wa(a,50+b);
//printf("%d\n",c);
実行結果は同じです。
~/c$ ./k0702 170
k0701.cに比べてこの色のついた部分やこの色のついた部分が異なっています。同じ名前の変数でも関数が異なれば別扱いであることを確かめています。
1: /* 変数の有効範囲(スコープ): k0703.c */ 2: #include <stdio.h> 3: 4: int wa(int a,int b){ 5: int s; 6: s = a + b; 7: a = 0; 8: printf("wa()の中では..\n"); 9: printf("a=%d\n",a); 10: printf("b=%d\n",b); 11: printf("s=%d\n",s); 12: return s; 13: } 14: 15: int main() 16: { 17: int a=100; 18: int b=20; 19: int s=3; 20: int c=wa(a,50+b); 21: printf("main()に戻って..\n"); 22: printf("a=%d\n",a); 23: printf("b=%d\n",b); 24: printf("c=%d\n",c); 25: printf("s=%d\n",s); 26: return 0; 27: }
int wa(int a,int b)
a = 0;
実行結果はこうなります。
~/c$ ./k0703 wa()の中では.. a=0 b=70 s=170 main()に戻って.. a=100 b=20 c=170 s=3聖愛中学高等学校