Розглянемо наступний код "С":
#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.
У мене те ж саме сумніви у декларації змінної . Розглянемо наступний код "С":
#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?
Редагувати:
Я не знаю деталей внутрішньої роботи компілятора, асемблера, процесора тощо. Основна ідея мого питання полягає в тому, що якщо я скажу (записую) повернене значення функції у вихідному коді, нарешті, після використання цієї функції, тоді мова "С" дозволяє комп'ютеру знайти це значення без помилок. Тепер чому комп'ютер не може знайти тип подібним чином. Чому тип Data_i неможливо знайти, як було знайдено зворотне значення Func_i (). Навіть якщо я використовую extern data-type identifier;
оператор, я не кажу про значення, яке слід повернути цим ідентифікатором (функцією / змінною). Якщо комп'ютер може знайти це значення, то чому він не може знайти тип. Навіщо нам взагалі потрібна передова декларація?
Дякую.
Func_i
недійсним. Ніколи не було правила неявно оголошувати невизначені змінні, тому другий фрагмент завжди був неправильним. (Так, компілятори все-таки приймають перший зразок, тому що він був дійсний, якщо неохайний, під C89 / C90.)