様々な引数

プログラム例 5.1] 様々な引数

01	/*************************/
02	/* 様々な引数            */
03	/*   coded by Y.Suganuma */
04	/*************************/
05	#include <stdio.h>
06	
07	bool max1(int x, int y) {
08		return x > y;
09	}
10	
11	bool min1(int x, int y) {
12		return x < y;
13	}
14	
15	int *min_max(int a, int x[], bool (*blk1)(int, int), auto blk2, int b = 20) {
16		a      = 5;
17		x[3]   = -3;
18		int *y = new int[3];
19	
20		int re1 = x[0];
21		for (int i1 = 1; i1 < 5; i1++)
22			re1 = blk1(re1, x[i1]) ? re1 : x[i1];
23	
24		int re2 = x[0];
25		for (int i1 = 1; i1 < 5; i1++)
26			re2 = blk2(re2, x[i1]) ? re2 : x[i1];
27	
28		y[0] = re1;
29		y[1] = re2;
30		y[2] = a + b;
31	
32		return y;
33	}
34	
35	int main()
36	{
37				// ラムダ式 max の定義と利用
38		auto max2 = [] (int x, int y) {
39			return x > y;
40		};
41		printf("   2 > 1 ? %d\n", max2(2, 1));
42				// ラムダ式 min の定義と利用
43		auto min2 = [] (int x, int y) {
44			return x < y;
45		};
46		printf("   1 < 2 ? %d\n", min2(1, 2));
47				// 最大値,最小値の計算
48		int a   = 10;
49		int x[] = {1, 4, 2, 3, 5};
50		int *y  = min_max(a, x, max1, max2);
51		printf("   max %d %d sum %d a %d x[3] %d\n", y[0], y[1], y[2], a, x[3]);
52		y = min_max(a, x, min1, min2);
53		printf("   min %d %d sum %d a %d x[3] %d\n", y[0], y[1], y[2], a, x[3]);
54	
55		return 0;
56	}
		
07 行目~ 09 行目

  最大値を計算するために使用され,大小を比較して,その結果を返す関数です.

11 行目~ 13 行目

  最小値を計算するために使用され,大小を比較して,その結果を返す関数です.

15 行目~ 33 行目

  2 つの整数( a と b )の和と,最大値または最小値を求める関数の定義です.2 番目の引数 x は配列であり,この配列に含まれる要素の最大値または最小値を求めることになります.3 番目は関数名を引数にした場合,かつ,4 番目はラムダ式を引数にした場合の記述です.5 番目は,和の対象となる引数であり,デフォルト引数となっています.C/C++ においては,デフォルト引数(複数でも良い)は必ず最後の引数である必要がありますが,その他の引数に対しては,数,順番に制限はありません

16,17 行目

  引数 a の値,及び,配列 x の 4 番目の要素( x[3] )の値を変更しています.一般に,関数では,引数の値がコピーされて渡されるため,関数内でその値を変更しても,関数を呼んだ側の値は変化しません.しかし,配列の場合は,そのアドレスがコピーされて渡されるため,関数内と関数を呼んだ側で同じ配列を指すことになり,関数内でその値を変更すると,関数を呼んだ側の値も変化します.

18 行目

  ここで定義した y[0] に関数名を引数にした場合の最大値または最小値,y[1] にラムダ式を引数にした場合の最大値または最小値,また,y[2] に a と b の和が入り,return 文によって,この y が戻されます( 32 行目).

20 行目~ 22 行目

  引数として渡された関数によって,最大値または最小値を求めています.

24 行目~ 26 行目

  引数として渡されたラムダ式によって,最大値または最小値を求めています.

38 行目~ 41 行目

  最大値を求めるために必要なラムダ式の定義とその確認です.

43 行目~ 46 行目

  最小値を求めるために必要なラムダ式の定義とその確認です.

48 行目~ 53 行目

  関数 min_max によって,2 つの整数の和,及び,最大値,最小値を求めています.51,53 行目に対する出力結果から明らかなように,この関数を呼んだ後も,a の値は変化しませんが,配列 x の 4 番目( x[3] )の値は変化しています.
(出力)
   2 > 1 ? 1
   1 < 2 ? 1
   max 5 5 sum 25 a 10 x[3] -3
   min -3 -3 sum 25 a 10 x[3] -3