Рассмотрим следующий код "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.)