Pertimbangkan kode "C" berikut:
#include<stdio.h>
main()
{
printf("func:%d",Func_i());
}
Func_i()
{
int i=3;
return i;
}
Func_i()
didefinisikan di akhir kode sumber dan tidak ada pernyataan yang diberikan sebelum digunakan dalam main()
. Pada waktu ketika kompilator melihat Func_i()
di main()
, itu keluar dari main()
dan tahu Func_i()
. Kompiler entah bagaimana menemukan nilai yang dikembalikan oleh Func_i()
dan memberikannya kepada printf()
. Saya juga tahu bahwa compiler tidak dapat menemukan jenis kembali dari Func_i()
. Ini, secara default mengambil (dugaan?) Yang tipe kembali dari Func_i()
menjadi int
. Itu jika kode memiliki float Func_i()
maka kompiler akan memberikan kesalahan: Jenis konflik untukFunc_i()
.
Dari diskusi di atas kita melihat bahwa:
Kompiler dapat menemukan nilai yang dikembalikan oleh
Func_i()
.- Jika kompiler dapat menemukan nilai yang dikembalikan dengan
Func_i()
keluar darimain()
dan mencari kode sumber, maka mengapa ia tidak dapat menemukan tipe Func_i (), yang secara eksplisit disebutkan.
- Jika kompiler dapat menemukan nilai yang dikembalikan dengan
Compiler harus tahu bahwa itu
Func_i()
adalah tipe float - itu sebabnya ia memberikan kesalahan tipe yang saling bertentangan.
- Jika kompiler tahu bahwa itu
Func_i
adalah tipe float, lalu mengapa ia masih menganggapFunc_i()
tipe int, dan memberikan kesalahan tipe yang saling bertentangan? Mengapa itu tidak dipaksaFunc_i()
menjadi tipe float.
Saya memiliki keraguan yang sama dengan deklarasi variabel . Pertimbangkan kode "C" berikut:
#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;
Kompiler memberikan kesalahan: 'Data_i' tidak dideklarasikan (digunakan pertama kali dalam fungsi ini).
- Ketika kompilator melihat
Func_i()
, ia pergi ke kode sumber untuk menemukan nilai yang dikembalikan oleh Func_ (). Mengapa kompiler tidak dapat melakukan hal yang sama untuk variabel Data_i?
Edit:
Saya tidak tahu detail kerja bagian dalam dari kompiler, assembler, prosesor, dll. Gagasan dasar dari pertanyaan saya adalah bahwa jika saya memberi tahu (tulis) nilai-kembali fungsi dalam kode sumber pada akhirnya, setelah penggunaan dari fungsi itu maka bahasa "C" memungkinkan komputer untuk menemukan nilai itu tanpa memberikan kesalahan. Sekarang mengapa komputer tidak dapat menemukan jenis yang sama. Mengapa tipe Data_i tidak dapat ditemukan karena nilai pengembalian Func_i () ditemukan. Bahkan jika saya menggunakan extern data-type identifier;
pernyataan itu, saya tidak mengatakan nilai yang harus dikembalikan oleh pengenal itu (fungsi / variabel). Jika komputer dapat menemukan nilai itu maka mengapa tidak dapat menemukan jenisnya. Mengapa kita perlu deklarasi maju sama sekali?
Terima kasih.
Func_i
tidak sah. Tidak pernah ada aturan untuk secara implisit mendeklarasikan variabel yang tidak terdefinisi, sehingga fragmen kedua selalu cacat. (Ya, kompiler masih menerima sampel pertama karena valid, jika ceroboh, di bawah C89 / C90.)