Hãy xem xét mã "C" sau:
#include<stdio.h>
main()
{
printf("func:%d",Func_i());
}
Func_i()
{
int i=3;
return i;
}
Func_i()
được định nghĩa ở cuối mã nguồn và không có khai báo nào được cung cấp trước khi sử dụng main()
. Đồng thời rất khi trình biên dịch thấy Func_i()
trong main()
, nó đi kèm ra khỏi main()
và phát hiện ra Func_i()
. Trình biên dịch bằng cách nào đó tìm thấy giá trị được trả về Func_i()
và đưa nó vào printf()
. Tôi cũng biết rằng trình biên dịch không thể tìm thấy kiểu trả về Func_i()
. Nó, theo mặc định mất (đoán?) Các kiểu trả về của Func_i()
được int
. Đó là nếu mã đã có float Func_i()
thì trình biên dịch sẽ báo lỗi: Các kiểu xung đột choFunc_i()
.
Từ các cuộc thảo luận ở trên, chúng ta thấy rằng:
Trình biên dịch có thể tìm thấy giá trị được trả về bởi
Func_i()
.- Nếu trình biên dịch có thể tìm thấy giá trị được trả về bằng
Func_i()
cách đi ramain()
và tìm kiếm mã nguồn, thì tại sao nó không thể tìm thấy loại Func_i (), được đề cập rõ ràng .
- Nếu trình biên dịch có thể tìm thấy giá trị được trả về bằng
Trình biên dịch phải biết rằng đó
Func_i()
là kiểu float - đó là lý do tại sao nó đưa ra lỗi của các kiểu xung đột.
- Nếu trình biên dịch biết rằng đó
Func_i
là kiểu float, thì tại sao nó vẫn giả sửFunc_i()
là kiểu int và đưa ra lỗi của các kiểu xung đột? Tại sao nó không thựcFunc_i()
sự là loại nổi.
Tôi có cùng nghi ngờ với khai báo biến . Hãy xem xét mã "C" sau:
#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;
Trình biên dịch đưa ra lỗi: 'Data_i' không được khai báo (lần đầu tiên sử dụng chức năng này).
- Khi trình biên dịch nhìn thấy
Func_i()
, nó đi xuống mã nguồn để tìm giá trị được trả về bởi Func_ (). Tại sao trình biên dịch không thể làm tương tự cho biến Data_i?
Biên tập:
Tôi không biết chi tiết về hoạt động bên trong của trình biên dịch, trình biên dịch, bộ xử lý, v.v. Ý tưởng cơ bản của câu hỏi của tôi là nếu tôi nói (ghi) giá trị trả về của hàm trong mã nguồn cuối cùng, sau khi sử dụng của chức năng đó thì ngôn ngữ "C" cho phép máy tính tìm giá trị đó mà không đưa ra bất kỳ lỗi nào. Bây giờ tại sao máy tính không thể tìm thấy loại tương tự. Tại sao không thể tìm thấy loại Data_i làm giá trị trả về của Func_i (). Ngay cả khi tôi sử dụng extern data-type identifier;
câu lệnh, tôi không nói giá trị được trả về bởi mã định danh (hàm / biến) đó. Nếu máy tính có thể tìm thấy giá trị đó thì tại sao nó không thể tìm thấy loại. Tại sao chúng ta cần tuyên bố chuyển tiếp ở tất cả?
Cảm ơn bạn.
Func_i
không hợp lệ. Không bao giờ có một quy tắc để khai báo ngầm định các biến không xác định, vì vậy đoạn thứ hai luôn bị sai. (Có, trình biên dịch vẫn chấp nhận mẫu đầu tiên vì nó hợp lệ, nếu cẩu thả, theo C89 / C90.)