将函数作为参数传递给同一函数

问题描述

我尝试在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;
}

解决方法

int add()是过时的样式,表示接受 any 参数(不同于C ++,它的意思是(void))。这是旧的标准“ K&R”样式的剩余部分,在该样式中分别指定了参数。 C暂时仅允许函数声明符使用这种形式。

6.11.6函数声明符
带空括号的函数声明符的使用(不是原型格式的参数 类型声明符)是过时的功能。
6.11.7函数定义
将函数定义与单独的参数标识符和声明列表一起使用 (不是原型格式的参数类型和标识符声明符)是过时的功能。

当函数 definitions 的列表为空时,适用以下条件(C11 6.7.6.3/14):

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

因此,该代码违反了约束,因此无效C。您具有函数定义,但显然已将其视为具有参数。 gcc在这里似乎不合规,因为即使使用最大警告和-pedantic,我也没有得到诊断消息。

关于“它起作用”的原因,请参见What must a C compiler do when it finds an error?