-1

我对以下函数的行为感到困惑。以下是我坚持的一些程序:

情况1:

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

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

它给出了预期的输出wow

案例二:

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());调用f调用,然后f从外部函数调用调用。你不存储返回值f不会做任何事情。编译器不能仅仅因为你忽略它的返回值就避免调用一个函数,除非它知道这个函数没有后果,而且这个函数确实有后果。

忽略函数的返回值一点也不稀奇。例如,您可能有一个“删除条目”函数,它返回它删除的条目数。您可能会在不关心它返回多少条目的上下文中调用该函数,因此您忽略返回值。该函数仍然必须运行,否则条目不会被删除。哎呀,您忽略了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 回答