首页 > 解决方案 > 将函数作为参数传递给同一函数

问题描述

我尝试在 sololearn 代码游乐场中运行以下代码,并且运行良好。有人可以分解一下,为什么它会起作用?

我不知道它是如何工作的,因为函数add()不接受任何参数,但它接收 add() 函数作为参数并计算总和两次。

#include <stdio.h>

int add(){
    int a,b;
    scanf("%d%d",&a,&b);
    printf("%d",a+b);
    return 0;
}
int main(){
    add(add());
    return 0;
}

标签: cfunction

解决方案


int add()是过时的风格,意味着接受任何参数(与 C++ 不同,它意味着(void))。它保留了旧的预标准“K&R”样式,其中单独指定了参数。C 仍然允许这种形式(目前)仅用于函数声明符。

6.11.6 函数声明符
使用带空括号的函数声明符(不是原型格式参数类型声明符)是一个过时的特性。
6.11.7 函数定义
使用具有单独参数标识符和声明列表(不是原型格式参数类型和标识符声明符)的函数定义是一个过时的特性。

当涉及到具有空列表的函数定义时,以下适用 (C11 6.7.6.3/14):

Constraints
/--/
标识符列表仅声明函数参数的标识符。作为该函数定义的一部分的函数声明器中的空列表指定该函数没有参数。

所以代码是违反约束的,它不是有效的C。你有一个函数定义,但它显然被视为有参数。gcc 在这里似乎特别不合规,因为即使有最大警告和-pedantic,我也没有收到任何诊断消息。

至于为什么“它起作用”,请参阅C 编译器发现错误时必须做什么?.


推荐阅读