ホームページ  >  記事  >  関数を定義内でネストできますが、ネストされた呼び出し内ではできませんか?

関数を定義内でネストできますが、ネストされた呼び出し内ではできませんか?

青灯夜游
青灯夜游オリジナル
2021-02-02 16:28:4234214ブラウズ

間違っています。関数はネストした呼び出しにすることができますが、ネストして定義することはできません。 C 言語では、すべての関数は並列です。つまり、関数を定義するときに関数は互いに独立しています。ある関数は別の関数に従属することはありません。つまり、定義内で関数をネストすることはできませんが、相互に呼び出すことはできますが、それらは互いに独立しています。 main 関数を呼び出すことができません。

関数を定義内でネストできますが、ネストされた呼び出し内ではできませんか?

このチュートリアルの動作環境: Windows 7 システム、C99 バージョン、Dell G3 コンピューター。

間違っています。関数はネストした呼び出しにすることができますが、ネストして定義することはできません。

C 言語関数

関数とは、特定の関数を独立して完了するために再利用できるコードの一部です。ユーザーによって渡されたデータを受信するかどうか。ユーザーデータを受け取る関数は定義時にパラメーターを指定する必要がありますが、ユーザーデータを受け取らない関数は指定する必要はありません。これに基づいて、関数はパラメーター付き関数とパラメーターなし関数に分類できます。

コードセグメントを関数にカプセル化するプロセスは、関数定義と呼ばれます。

関数の定義

関数がユーザーから渡されたデータを受け取らない場合は、パラメーターなしで関数を定義できます。以下に示すように:

dataType  functionName(){
    //body
}

関数がユーザーから渡されたデータを受信する必要がある場合は、パラメーターを使用して定義する必要があります。以下に示すように:

dataType  functionName( dataType1 param1, dataType2 param2 ... ){
    //body
}
  • dataType は戻り値の型で、int、float、char などの C 言語の任意のデータ型を指定できます。

  • functionName は識別子の一種である関数名で、命名規則は識別子と同じです。関数名の後の括弧 ( ) は省略できません。

  • dataType1 param1、dataType2 param2... はパラメータのリストです。関数には、パラメーターを 1 つだけ指定することも、複数のパラメーターを で区切って指定することもできます。パラメータは本質的に変数であり、定義時に型と名前を指定する必要があります。パラメーターなし関数の定義と比較すると、パラメーター化関数の定義にはパラメーター リストが 1 つだけあります。

  • body は関数本体です。これは、関数が実行する必要があるコードであり、関数の主要部分です。文が 1 つだけの場合でも、関数本体は { } で囲む必要があります。

  • 戻り値がある場合は、関数本体の return ステートメントを使用してそれを返します。返されるデータのタイプは dataType と同じである必要があります。

    return は C 言語のキーワードで、処理結果を返す関数内でのみ使用できます。

例:

#include <stdio.h>
int sum(){
    int i, sum=0;
    for(i=1; i<=100; i++){
        sum+=i;
    }
    return sum;
}
int main(){
    int a = sum();
    printf("The sum is %d\n", a);
    return 0;
}

実行結果:

The sum is 5050

関数は定義をネストできません、main も関数定義なので、sum は main の外側に配置する必要があります。関数は最初に定義してから使用する必要があるため、sum は main の前に配置する必要があります。

注: main は関数定義であり、関数呼び出しではありません。実行可能ファイルがメモリにロードされると、システムは main 関数から実行を開始します。つまり、システムは定義した main 関数を呼び出します。

チュートリアルの推奨事項: 「c 言語チュートリアル ビデオ

関数呼び出し

いわゆる関数呼び出し(関数呼び出し)、つまり、すでに定義されている関数を使用します。関数呼び出しの一般的な形式は次のとおりです。

functionName(param1, param2, param3 ...);

functionName は関数名、param1、param2、param3... は実際のパラメータ リストです。実際のパラメータには、定数、変数、式などを使用できます。複数の実パラメータはカンマで区切られます。

C 言語では、関数を呼び出すさまざまな方法があります。たとえば、次のとおりです。

//函数作为表达式中的一项出现在表达式中
z = max(x, y);
m = n + max(x, y);
//函数作为一个单独的语句
printf("%d", a);
scanf("%d", &b);
//函数作为调用另一个函数时的实参
printf( "%d", max(x, y) );
total( max(x, y), min(m, n) );

関数のネストされた呼び出し

関数をネストした定義にすることはできません。ただし、呼び出しは入れ子にすることができます。つまり、1 つの関数の定義または呼び出し中に、別の関数への呼び出しが許可されます。

[例] Calculate sum = 1! 2! 3! ... (n-1)! n!

分析: 階乗計算用と階乗計算用の 2 つの関数を作成できます。累積和を計算するために使用されます。

#include <stdio.h>
//求阶乘
long factorial(int n){
    int i;
    long result=1;
    for(i=1; i<=n; i++){
        result *= i;
    }
    return result;
}
// 求累加的和
long sum(long n){
    int i;
    long result = 0;
    for(i=1; i<=n; i++){
        //在定义过程中出现嵌套调用
        result += factorial(i);
    }
    return result;
}
int main(){
    printf("1!+2!+...+9!+10! = %ld\n", sum(10));  //在调用过程中出现嵌套调用
    return 0;
}

操作結果:

1!+2!+...+9!+10! = 4037913

factorial() の呼び出しは sum() の定義に現れ、sum() の呼び出しは printf() の呼び出し中に現れ、printf ( ) は main() によっても呼び出され、それらの全体的な呼び出し関係は次のとおりです:

main() --> printf() --> sum() --> factorial()

関数 A() が定義または呼び出しプロセス中に別の関数 B() を呼び出す場合、それを A() と呼びます。呼び出し関数またはメイン関数、B() は呼び出される関数と呼ばれます。

呼び出し側関数が呼び出された関数に遭遇すると、呼び出し側関数は一時停止し、CPU は呼び出された関数のコードを実行し、呼び出された関数の実行が完了すると、呼び出し側関数に戻ります。実行を続けます。

C 言語プログラムの実行プロセスは、単純または複雑な呼び出しチェーンを形成する複数の関数間の相互呼び出しプロセスと考えることができます。このチェーンの開始点は main() であり、終了点も main() です。 main() がすべての関数の呼び出しを完了すると、値 (return 0; など) を返し、自身の寿命を終了し、それによってプログラム全体が終了します。

関数は再利用できるコード ブロックです。CPU はコードを 1 つずつ実行します。関数呼び出しに遭遇すると、CPU はまず現在のコード ブロック内の次のコードのアドレスを記録する必要があります (アドレスがは 0X1000)、別のコード ブロックにジャンプし、実行完了後に戻って 0X1000 でコードの実行を継続します。このプロセス全体は、CPU が休憩し、別の作業を行うために手元の作業を一時的に中断し、終了後に前の作業を続行することに相当します。

コンピュータ プログラミングの詳細については、プログラミング ビデオをご覧ください。 !

以上が関数を定義内でネストできますが、ネストされた呼び出し内ではできませんか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。