c - 递归中的返回类型

标签 c

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

案例1:

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

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

它给出了预期的输出

案例2:

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

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

它给出了错误:无效使用void表达式,这是显而易见的。

案例3:

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

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

为什么它给出输出wow wow

f() 的返回类型为 int。但在 main 中它没有存储在任何变量中。此外,f() 没有接受任何参数,但在情况 3 中,它将接受 f() 返回的参数。

相同的代码在 C++ 中不起作用。

最佳答案

代码f(f());从内部函数调用中调用f,然后从外部函数调用中调用f。您不存储 f 的返回值不会执行任何操作。编译器无法仅仅因为忽略函数的返回值而避免调用函数,除非它知道该函数不会产生任何后果,而该函数确实会产生后果。

忽略函数的返回值并不罕见。例如,您可能有一个“删除条目”函数,该函数返回它删除的条目数。您可能会在不关心它返回多少条目的上下文中调用该函数,因此您会忽略返回值。该函数仍然必须运行,否则该条目将不会被删除。哎呀,您忽略了 printf 的返回值。如果它没有被调用,你会感到非常惊讶。

关于c - 递归中的返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12037195/

相关文章:

c - 在 Linux Mint 上的 Sublime Text 3 中运行 C 程序

c - 如何在Visual Studio 2012 for Windows 8 上编译和执行C 程序?

c - 数组作为数组和指针 C 传递

c - GCC 和乘法指令

c - 为什么 malloc() 和 calloc() 在使用 CUDA 时似乎不起作用?

c - 在 GCC 中实现编译时只读函数指针表

c++ - 如何确定使用哪个 C/C++ 编译器?

c - 如何使用 sprintf 追加字符串?

C 指针差异 Char Int

c - 使用 fprintf 输出 __LINE__ 时出现段错误