序文
親愛なる皆さん、何日も経ちましたが、Xiaoyang は今日、皆さんと一緒に C 言語の新しい知識を学ぶためにここに来ました。関数、わかりました、ナンセンスな話はやめて、本題に直接行きましょう!
関数定義
通常、初めて関数を見たとき、数学のさまざまな関数を思い浮かべますが、Xiaoyang が今日共有したのは C 言語の関数です。大きな問題を 1 つずつ解決するには、多くの小さな問題に分解する必要があることがよく知られています。C 言語でも同じことが当てはまります。大規模なプログラムのコードの特定の部分は、1 つ以上のステートメント ブロックで構成されており、この特定のコードの一部は「 」完成某种特定的功能
用に設計されて、他のコードと比較して が付いているため「 」一定的独立性
と呼ばれます。子程序(函数)
機能の分類
ライブラリ関数
まず第一に、ライブラリ関数とは何なのかを理解する必要があります。ライブラリ関数を使用するにはどうすればよいですか?
C言語を学んで以来、何度も頻繁に使用する関数がたくさんあります。
- 何らかの情報を画面に表示する(printf関数)
- nのk乗を計算する(pow関数)
- 文字列の長さを計算する (strlen 関数)
上記のライブラリ関数は、開発プロセスですべてのプログラマが使用できますが、プログラムの移植性を向上させ、プログラムの効率を向上させるために、C 言語では、基本ライブラリで同様の一連のライブラリ関数が提供されており、便利です。プログラマーがソフトウェア開発を行うための。
ライブラリ関数は多数あるため、すべてをリストすることは不可能であり、簡単に分類することしかできません。
IO函数
字符串操作函数
字符操作函数
内存操作函数
时间/日期函数
数学函数
其他库函数
共有サイト
ライブラリ関数について理解したところで、ライブラリ関数をクエリする場合はどのツールを使用すればよいでしょうか? Xiaoyang は、ライブラリ関数をクエリするための Web サイト
cplusplusを提供しています。
使用例
#include<stdio.h>//printf函数需要的头文件
#include<math.h>//pow函数需要的头文件
int main()
{
int a1 = 1, b1 = 2, c1 = 0;
c1 = a1 + b1;
printf("%d\n", c1);
double a2 = 2.0, b2 = 4.0, c2 = 0.0;
c2 = pow(a2, b2);//计算a2的b2次方
printf("%lf", c2);
return 0;
}
注:
ライブラリ関数を使用する場合は、#include に対応するヘッダー ファイルをインクルードする必要があります。
カスタム関数
ライブラリ関数は万能ではありません。自分で完成させなければならない関数はまだたくさんあります。そうでない場合、プログラマは他に何をする必要があるでしょうか? 現時点では、プログラムの作成を支援するために、ニーズをよりよく満たすいくつかの関数を設計できます。それだけです自定义函数
。
カスタム関数はライブラリ関数と同じで、函数名
と返回值
があります函数参数
。
機能の構成
函数返回值类型 函数名 (参数1,参数2,参数3……)
{
//...函数体
}
使用例
2 つの数値のうち大きい方を求めます
#include<stdio.h>
int Max(int x, int y)
{
int z = 0;
z = x > y ? x : y;
return z;
}
int main()
{
int a = 0, b = 0, max = 0;
scanf("%d%d", &a, &b);
max = Max(a, b);
printf("这两个数中较大值是%d", max);
return 0;
}
注:
上記の関数 max の max は関数名、a と b は実引数(実引数)ですが、
関数名は意味のある名前にしないと、書いた後に見返した時に意味が分からなくなります。
関数パラメータ
C言語の関数のパラメータは大きく2種類に分けられます。
实参(实际参数)
関数に渡される実際のパラメータは と呼ばれます实参
。
实参可以是:常量,变量,表达式,函数等
。
実際のパラメータがどのような種類の量であるかに関係なく、関数が呼び出されるとき、それらの値は仮パラメータに転送できるように、明確な値を持っている必要があります。形参(形式参数)
仮パラメータは、関数名の後の括弧内の変数を参照します。形式参数只有在函数被调用的过程中才实例化(分配内存单元)
これは、いわゆる であるためです形式参数
。形式参数当函数调用完成之后就自动销毁了
。
したがって、仮パラメータは関数内でのみ有効です。
知らせ:
- 仮パラメータ(仮パラメータ)と実パラメータ(実パラメータ)は同じ空間を使用しません。(住所が違います)
- 仮パラメータがインスタンス化されると、それは実パラメータの一時コピーと同等になります。
関数呼び出し
関数呼び出しには次の 2 種類があります。
- 値による呼び出し:
関数の仮パラメータと実パラメータは異なるメモリ ブロックを占有し、仮パラメータを変更しても実パラメータには影響しません。 - アドレスによる呼び出し: アドレス
による呼び出しは、関数の外で作成された変数のメモリ アドレスを関数のパラメーターに渡すことによって関数を呼び出す方法です。この方法でパラメーターを渡すと、関数と関数の外部の変数との間に実際の接続を確立できます。つまり、関数の内部で関数の外部の変数を直接操作できます。
使用例:
#include<stdio.h>
void Swap1(int x, int y)
{
int tmp = 0;
tmp = x;
x = y;
y = tmp;
}
void Swap2(int* x, int* y)
{
int tmp = 0;
tmp = *x;
*x = *y;
*y = tmp;
}
int main()
{
int a = 1, b = 2;
Swap1(a, b);
printf("a=%d,b=%d\n", a, b);
Swap2(&a, &b);
printf("a=%d,b=%d", a, b);
return 0;
}
知らせ:
传值调用对形参的修改不会影响实参!
ネストされた呼び出しと関数の連鎖アクセス
ネストされた呼び出し
定義: 関数が別の関数を呼び出す
使用例
#include<stdio.h>
int Max(int x, int y)//函数1
{
return (x > y) ? x : y;
}
void Print(int x, int y)//函数2
{
int i = 0;
int c = Max(x, y);
for (i = 0; i < c; i++)
printf("努力学习+1\n");
}
int main()
{
int a = 0, b = 0;
scanf("%d%d", &a, &b);
Print(a, b);
return 0;
}
チェーンアクセス
把一个函数的返回值作为另外一个函数的参数
使用例
#include<stdio.h>
int main()
{
printf("%d", printf("%d", printf("%d", 43)));
return 0;
}
補足知識:
printf函数的返回值是打印在屏幕上字符的个数。
分析:
- printf(“%d”, 43) は最初に 43 を出力し、次に画面に表示される文字数が 2 であるため、戻り値は 2 になります。
- printf("%d", printf("%d", 43) は printf("%d", 2) と同等 → 2 を印刷した後、画面に印刷される文字数は 1 なので、戻り値は 1 になります;
- printf("%d", printf("%d", printf("%d", 43))) したがって、最終結果は 4321 を出力します。
関数の宣言と定義
関数宣言
- 関数の定義を確認する前に、関数の名前、パラメーター、戻り値の型を事前にコンパイラーに伝える必要があります。関数を宣言したということは、この関数があるということを意味するだけで、具体的な構造があるかどうかはわかりません。
- 関数の宣言は通常、関数を使用する前に記述され、次の条件を満たす必要があります。
先声明后使用
- 関数宣言は通常、次
头文件
の場所に配置されます。
関数定義
函数的定义是指函数的具体实现,交代函数的功能实现
関数の再帰
程序调用自身的编程技巧称为递归
必要な条件
- 制限があります。制限が満たされると再帰は続行されません。
- 再帰呼び出しのたびにこの制限にどんどん近づいていきます
使用例
整数値 (符号なし) を受け入れ、その各ビットを順番に出力します (例: 入力: 1234、出力 1 2 3 4)。
#include<stdio.h>
void Print(int x)
{
if (x > 9)
Print(x / 10);
printf("%d ", x % 10);
}
int main()
{
int a = 1234;
Print(a);
return 0;
}
下の個人名刺をクリックしてブロガーの個人 WeChat を追加すると、コミュニケーションがより便利になります~