考虑下面的“ C”代码:
#include<stdio.h>
main()
{
printf("func:%d",Func_i());
}
Func_i()
{
int i=3;
return i;
}
Func_i()是在源代码的末尾定义的,并且在main()。中使用之前没有提供声明。在编译器Func_i()进入的时候main(),它出来main()并找到了Func_i()。编译器会以某种方式找到返回的值Func_i()并将其提供给printf()。我也知道,编译器无法找到返回类型的Func_i()。它在默认情况下需要(猜测?)的返回类型的Func_i()是int。就是说,如果代码具有float Func_i(),编译器将给出错误:的类型冲突Func_i()。
从上面的讨论中我们看到:
编译器可以找到由返回的值
Func_i()。- 如果编译器可以找到返回的值
Func_i()由未来的出来main()和向下搜索源代码,那么为什么就不能找到Func_i(),它的类型明确提及。
- 如果编译器可以找到返回的值
编译器必须知道它
Func_i()是float类型的-这就是为什么它会产生冲突类型的错误的原因。
- 如果编译器知道该
Func_i类型为float类型,那么为什么仍假定它Func_i()为int类型,并给出类型冲突的错误?为什么不强制使它Func_i()成为float类型。
我对变量声明也有同样的疑问。考虑下面的“ C”代码:
#include<stdio.h>
main()
{
/* [extern int Data_i;]--omitted the declaration */
printf("func:%d and Var:%d",Func_i(),Data_i);
}
Func_i()
{
int i=3;
return i;
}
int Data_i=4;
编译器给出错误:未声明“ Data_i”(此函数中的首次使用)。
- 当编译器看到
Func_i(),它会进入源代码以查找Func_()返回的值。为什么编译器不能对变量Data_i做同样的事情?
编辑:
我不知道编译器,汇编器,处理器等的内部工作的详细信息。我的问题的基本思想是,使用后,如果我在源代码中最后告诉(写)函数的返回值,然后,使用“ C”语言可以使计算机找到该值而不会出现任何错误。现在为什么计算机无法类似地找到类型。为什么无法找到Data_i的类型,因为找到了Func_i()的返回值。即使我使用extern data-type identifier;语句,也不会告诉该标识符(函数/变量)要返回的值。如果计算机可以找到该值,那么为什么找不到该类型。为什么我们完全需要前向声明?
谢谢。
Func_iinvalid。从来没有规则隐式声明未定义的变量,因此第二个片段总是格式错误。(是的,编译器仍然接受第一个示例,因为它在C89 / C90下很有效,如果草率的话。)