2

はポストインクリメントなので、次のプログラムのように使うとb++のインクリメントはどうなるでしょうか?breturn b++

#include<stdio.h>

int foo(int);

int main()
{
   int a=8;
   printf("%d",foo(a));
}

int foo(int a)
{
   static int  b=a*a;
    return b++;
}

編集

#include<stdio.h>
int foo();

int main()
{
foo();
foo();
}

int foo()
{
    static int b=1;
    printf("%d\n",b);
    return b++;
}

結果

1

2

私の編集で見たように、なぜbインクリメントされるのですかreturn?その関数をすぐに終了するべきではないのですか?b制御が に戻った後でもインクリメントされるのはなぜmain()ですか? 関数内のすべてのアクティビティは、リターン後に終了するはずではありませんか?

4

4 に答える 4

5

多くの C (サブ) 式には、値と副作用があります。

の値は、式を評価する前b++の の値です。bその副作用は、値をb1 増やすことです。

したがって、この式は とreturn b++;update の以前の値を返しbますb。が static の場合b、更新は次の関数呼び出しまで残ります。がb単純な古いローカル変数である場合、更新は失われます (スマート コンパイラは、オブジェクトを更新するコードを発行しません)。

于 2013-05-12T08:28:05.313 に答える
4

bの初期化子が定数ではないため、実際には、このコードはコンパイルされません。

は static であるためb、本質的にはグローバル変数であり、 の前に初期化されますがmain、その時点でaは存在しません。

一方、これを C++ としてコンパイルするとb、最初に呼び出されたときに初期化fooされるため、値 64 が取得されます。戻り時にb++インクリメントされ、65 として格納されますが、戻り値は 64 です。fooもう一度呼び出すと、 65 を返します ( b66 です)。

編集されたコードに基づいて編集します。

したがって、コードは基本的に次のように実行されます。

 int temp = b;
 b = b + 1;
 return temp; 

これは、C が定義する方法です。の結果x++は前の値xですが、 の値xはインクリメントです。は本質的にグローバルであるためstatic(ただし、名前がないため、その関数の外では使用できません)、値は関数の呼び出し間で保持され、main呼び出される前に初期化されます。

于 2013-05-12T08:15:46.070 に答える
3

return b++;次と同等です。 int c = b; b = c + 1; return c;

あなたの新しい質問に答えるにはb++: このような式を評価すると、bインクリメントされます。- 関数内のすべてのアクティビティは、戻り後に「終了」しますがb、静的変数として宣言されます。この場合、その値は関数の後続の実行を通じて持続します。

わかりやすくするために、ポストインクリメントは次のような関数です

int postincrement(int& x) {
    int y = x;
    x = x + 1;
    return y;
}

(もちろん、b++インクリメントbがまったく効果がないことがわかった場合、コンパイラは a を最適化できますが、この場合は効果がある ( static int をインクリメントするb) ため、最適化して除外することはできません。)

于 2013-05-12T08:06:14.573 に答える
1

このポストインクリメントはまったく役に立たない -bローカルスコープを持っているため、インクリメントされた値は の後に破棄されreturnます。コンパイラが賢い場合は、最適化する可能性が最も高くなります。

于 2013-05-12T08:06:28.403 に答える