-1

次の関数の動作について混乱しています。以下は私がこだわったいくつかのプログラムです:

ケース1:

void f()
{
    printf("wow\t");
}

int main()
{
    f();
    return 0;
}

期待どおりの出力が得られますwow

ケース2:

void f()
{
    printf("wow\t");
}

int main()
{
    f(f());
    return 0;
}

それerror: invalid use of void expressionは明らかです。

ケース3:

int f()
{
    printf("wow\t");
}

int main()
{
    f(f());
    return 0;
}

なぜそれが出力を与えるのwow wowですか?

f()リターンタイプがありintます。しかし、その中mainにはどの変数にも格納されていません。またf()、引数を取りませんでしたが、ケース3の場合、。によって返される引数を取りますf()

同じコードはC++では機能しません。

4

2 に答える 2

2

コードは内部関数呼び出しから呼び出し、次にf(f());外部関数呼び出しから呼び出します。からの戻り値を保存しないことは何もしません。コンパイラーは、関数に影響がないことを認識していない限り、戻り値を無視したという理由だけで関数の呼び出しを回避することはできません。また、この関数には結果があります。fff

関数の戻り値を無視することは、まったく珍しいことではありません。たとえば、削除したエントリの数を返す「エントリの削除」関数があるとします。返されるエントリの数を気にしないコンテキストでその関数を呼び出す場合があるため、戻り値は無視してください。関数を実行する必要があります。そうしないと、エントリが削除されません。ちなみに、あなたはの戻り値を無視していますprintf。それが呼び出されなかった場合でも、あなたはかなり驚かれることでしょう。

于 2012-08-20T11:59:14.980 に答える
2

Cでは、関数がパラメーターを受け取らないという事実を明示的に宣言する必要があります。例えば:

int f(void)
{
    printf("wow\t");
}

int main()
{
    f(f());
    return 0;
}

与える:

error: too many arguments to function ‘f’

C++ではそれは異なります。int f() {}と同等int f(void) {}です。

于 2012-08-20T12:02:38.290 に答える