Рассмотрим следующий код "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» undeclared (первое использование в этой функции).
- Когда компилятор видит
Func_i()
, он переходит к исходному коду, чтобы найти значение, возвращаемое Func_ (). Почему компилятор не может сделать то же самое для переменной Data_i?
Редактировать:
Я не знаю деталей внутренней работы компилятора, ассемблера, процессора и т. Д. Основная идея моего вопроса заключается в том, что если я сообщу (напишу) возвращаемое значение функции в исходном коде, наконец, после использования этой функции, то язык «С» позволяет компьютеру найти это значение без каких-либо ошибок. Теперь, почему компьютер не может найти тип аналогичным образом. Почему нельзя найти тип Data_i, так как было найдено возвращаемое значение Func_i (). Даже если я использую extern data-type identifier;
оператор, я не говорю значение, которое будет возвращено этим идентификатором (функция / переменная). Если компьютер может найти это значение, то почему он не может найти тип. Зачем нам вообще нужна предварительная декларация?
Спасибо.
Func_i
недействительным. Там никогда не было правила, чтобы неявно объявлять неопределенные переменные, поэтому второй фрагмент всегда был искажен. (Да, компиляторы все еще принимают первый образец, потому что он действителен, хотя и небрежно, в соответствии с C89 / C90.)