2012-06-16 23 views
20

Trong chương trình c nàybiến tuyên bố mà không cần bất kỳ kiểu dữ liệu trong c

a=8; 
main() 
{ 
    printf("%d", a); 
} 

biến một đã được công bố mà không cần bất kỳ loại dữ liệu và chương trình này vẫn biên dịch thành công và cung cấp cho các đầu ra mong muốn.
sản lượng ::

8 

nhìn thấy nó trên ideone.
nhưng, khi tôi khai báo cùng một biến bên trong chính, nó cho lỗi biên dịch.

main() 
{ 
    a=8; 
    printf("%d", a); 
} 

sản lượng ::

prog.c:2: warning: return type defaults to ‘int’ 
prog.c: In function ‘main’: 
prog.c:3: error: ‘a’ undeclared (first use in this function) 
prog.c:3: error: (Each undeclared identifier is reported only once 
prog.c:3: error: for each function it appears in.) 
prog.c:4: warning: implicit declaration of function ‘printf’ 
prog.c:4: warning: incompatible implicit declaration of built-in function ‘printf’ 

thấy here.

Chương trình đầu tiên hoạt động như thế nào nhưng chương trình thứ hai?

Trả lời

22

Những gì bạn thấy ở đây là "Implicit Int Rule" tại nơi làm việc. Đơn giản chỉ cần đặt các quy tắc nói:

"A variable declared without an explicit type name is assumed to be of type int ."

Lưu ý rằng quy tắc này đã bị thu hồi trong c99 Chuẩn [Ref 1] .Tuy nhiên, tùy thuộc vào trình biên dịch của bạn và các thiết lập của nó, ví dụ đầu tiên có thể biên dịch với một cảnh báo, hoặc sẽ không biên dịch được (với cài đặt biên dịch chặt chẽ)

Nếu bạn biên dịch ví dụ đầu tiên có cài đặt nghiêm ngặt tuân thủ c99 Chuẩn trình biên dịch sẽ cho bạn biết nguyên nhân gốc.

kiểm tra here.

cc1: warnings being treated as errors
prog.c:1: error: data definition has no type or storage class
prog.c:1: error: type defaults to ‘int’ in declaration of ‘a’
prog.c:3: error: return type defaults to ‘int’
prog.c: In function ‘main’:
prog.c:4: error: implicit declaration of function ‘printf’
prog.c:4: error: incompatible implicit declaration of built-in function ‘printf’

EDIT:

why does the first example work but second does not?

Lưu ý sự nhấn mạnh vào dòng chữ "biến tuyên bố" trong quy tắc.

Trong ví dụ đầu tiên, kể từ khi tuyên bố là ở phạm vi toàn cầu nó được coi là một khai ImplicitImplicit Rule Int được áp dụng cho nó.

Trong ví dụ thứ hai, tuyên bố đóng vai trò là Chuyển nhượng và không phải là Tuyên bố. Vì không có tuyên bố, Quy tắc int ngầm định không áp dụng tại đây. Trong trường hợp không có bất kỳ loại trình biên dịch không thể xác định loại a là gì và do đó báo cáo lỗi.


[Ref 1]

C99 Tiêu chuẩn: Lời nói đầu
Para 5:

This edition replaces the previous edition, ISO/IEC 9899:1990 , as amended and corrected by ISO/IEC 9899/COR1:1994 , ISO/IEC 9899/COR2:1995 , and ISO/IEC 9899/AMD1:1995 .
Major changes from the previous edition include:
.....
.....
— remove implicit int
.....
.....

+0

Tôi đã hủy nó ;-) – sczizzo

+0

Tôi cảm thấy nó có giá trị. Tuy nhiên, để có câu trả lời hoàn chỉnh hơn, bạn có thể giải thích rằng trong ví dụ thứ hai, 'a = 8' là một nhiệm vụ, không phải là một tuyên bố. – sczizzo

+2

@pmr: Hy vọng câu trả lời đã chỉnh sửa thỏa mãn phản đối của bạn. –

0

Đó là bởi vì trong C, bất kỳ biến/chức năng là ngầm int.

Đây là lý do tương tự mà bạn có thể sử dụng register thay vì register int, hoặc unsigned thay vì unsigned int, auto thay vì auto int, và static thay vì static int. Cá nhân tôi luôn rõ ràng đủ điều kiện cho các biến của tôi với int, nhưng cho dù bạn có hay không là lựa chọn của bạn.

+0

Trong Shakespearean C. –

0

Biến của bạn không có loại dữ liệu (int) mặc dù bạn không viết loại dữ liệu.

Thực tiễn không tốt để tận dụng tính năng đó.

Dường như trình biên dịch của bạn không cho phép điều đó xảy ra bên trong một hàm. Điều đó có ý nghĩa bởi vì nếu nó cho phép "a = 8;" trong một chức năng nó sẽ rất khó để bắt một số lỗi chính tả.

0

Trong C++ 11, có auto từ khóa.Thật không may, C và C++ là ngôn ngữ được nhập mạnh, có yêu cầu xác định loại nghiêm ngặt cho từng biến được khai báo. Một số compliers giả sử int là mặc định, nhưng đó là tâm trí của họ và nó không nên được sử dụng, bởi vì nó thừa nhận như một thói quen lập trình sai.

+0

Câu hỏi này là về C thay vì C++. C là một ngôn ngữ với một tiêu chuẩn có thể được sử dụng để trả lời câu hỏi này. –

4

a=8; bên ngoài của hàm trông giống như một Statment khai, nơi a là sự xác định kê khai = 8 là khởi tạo. C được sử dụng để cho phép bỏ qua các loại trong các bộ khai báo và mặc định là int trong trường hợp đó. (Kể từ C99, điều này không còn được phép.)

Tuy nhiên, trong một hàm, a=8; trông giống như một tuyên bố biểu (một biểu hiện phân công) và biểu tượng a không được giải quyết. (Lưu ý rằng bạn không có câu lệnh biểu thức bên ngoài chức năng.)

Nếu bạn cố gắng làm, ví dụ static a = 8;, sau đó nó sẽ giống như một khai báo và phải biên dịch vì loại mặc định là int.

Dù sao, đừng dựa vào đó :-) Viết các loại của bạn rõ ràng.

+0

@AnttiHaapala Tôi thực sự muốn C99 là phổ biến cách đây 18 năm. :(Cập nhật câu trả lời, có vẻ tốt bây giờ? – Kos

+0

Tốt hơn nhiều ;-) –

0

thậm chí tham số chức năng có thể được viết dưới dạng int ngầm định. dụ:

fun(n){printf("%d",n);} 

Đoạn mã trên hoạt động tốt nhưng một khi một datatype cố định được bao gồm trong các thông số, như

fun(n,char c){ printf("%d",n);} 

Nó cho thấy lỗi: lỗi: dự kiến ​​')' trước khi 'char' |

+0

Đây là vấn đề riêng đối với câu hỏi. 'fun (n)' giới thiệu định nghĩa hàm K & R –

Các vấn đề liên quan