C中的返回类型

C中的返回类型,c,return,C,Return,若我们不指定返回类型,编译器将假定隐式返回类型为int。我试图返回一个char,它在GCC中运行良好。我只是这样定义的 #include <stdio.h> char fun(char ch) { return ch; } int main() { char ch = fun('A'); printf("ch : %c\n",ch); } #包括 char-fun(char-ch) { 返回ch; } int main() { cha

若我们不指定返回类型,编译器将假定隐式返回类型为
int
。我试图返回一个
char
,它在GCC中运行良好。我只是这样定义的

#include <stdio.h>

char fun(char ch)
{
      return ch;
}

int main()
{
        char ch = fun('A');
        printf("ch : %c\n",ch);
}
#包括
char-fun(char-ch)
{
返回ch;
}
int main()
{
char ch=乐趣(“A”);
printf(“ch:%c\n”,ch);
}
但是,在下面的程序中不指定返回类型,而是

#include <stdio.h>

char fun(char ch)
{

}

int main()
{
        char ch = fun('A');
        printf("ch : %c\n",ch);
}
#包括
char-fun(char-ch)
{
}
int main()
{
char ch=乐趣(“A”);
printf(“ch:%c\n”,ch);
}
它工作正常意味着返回一个
char
。为什么?


为什么不默认返回
int
返回类型?

实际上,在这两种情况下,您都指定了返回类型。在第二种情况下,您的功能是:

char fun(char ch)
{

}
它指定
char
作为返回类型。在第二种情况下,您没有指定的是函数的返回值(这将导致未定义的行为)

注意:通常,函数声明具有以下结构:

return_type function_name( parameter list ) {
   body of the function
}

因此,您已经清楚地将函数的返回类型声明为
char
。有关更多信息,请参阅。

正如前面所指出的,返回值的目标似乎被误解了

函数声明 当声明一个函数时,你不必给它一个函数体,你是在告诉编译器在整个程序的某个地方会有这样的函数

这:

char fun(char ch);
int main()
{
    char ch = fun('A');
}
仍然有效,并编译(到对象文件)

这样做就是告诉编译器该函数现在不存在,但以后应该存在。这在使用库或其他对象文件链接以形成最终程序时非常有用

不幸的是,C编译器仍然不够聪明,无法推断出您在编写时的确切意图

int main()
{
    char ch = fun('A');
}
它会尝试通过默认为一个错误的类型来进行最好的猜测,或者停止猜测,因为猜测是错误的

这方面的一个实际例子是

职能c 使用
cc-cfun.c
编译将编译
fun.o
对象文件

main.c
#包括
char-fun(char-ch);//乐趣存在于fun.c中,但不存在于main.c中。这是一种告诉函数存在的方式
int main()
{
char ch=乐趣(“A”);
printf(“ch:%c\n”,ch);
}
使用
cc-cmain.c
编译将编译
main.o
对象文件

然后用
cc fun.o main.o-o main
链接这两个文件,它会将两个目标文件链接到程序
main

返回语句
return
语句有两个目标

  • 设置要发送给调用方的值
  • 停止当前函数的执行流并返回调用方执行流
在函数原型中,您必须声明函数将返回什么。当每个函数只有一个return语句时,这似乎是相当多的额外代码,但是如何确保您遵守承诺呢

如果函数中有两个return语句。。。返回不同类型?函数的推断类型应该是什么


如果返回的是
int
,计算机是否应将其存储在
char
中?如果字符太大怎么办?如果您返回一个
struct
,该怎么办?

它不是缺少的返回类型。它是您遗漏的返回值,并在此过程中调用未定义的行为。一旦你调用UB,你观察到的是不相关的。但是如果没有返回类型,为什么要返回字符'A'?我想你不知道返回类型是什么。这两个函数的声明返回类型都有
char
。第二个示例中缺少的是返回值,正如我所说的,如果没有通过声明函数returns
char
来实现您所做的承诺,并且没有真正做到这一点,就会调用未定义的行为。在那之后你观察到的“它回来了”是无关紧要的。它未定义。但在函数内部未指定返回类型。@Anjan返回类型是在函数名旁边指定的,而不是在函数名内部指定的。表示编译器内部检查函数返回类型。正确的?
char fun(char ch)
{
    return ch;
}
#include <stdio.h>

char fun(char ch); // fun exist in fun.c but not in main.c this is a way yo tell that the function exists

int main()
{
    char ch = fun('A');
    printf("ch : %c\n",ch);
}