考虑下面的“ 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_i
invalid。从来没有规则隐式声明未定义的变量,因此第二个片段总是格式错误。(是的,编译器仍然接受第一个示例,因为它在C89 / C90下很有效,如果草率的话。)