2010-01-08 50 views
11

Tại sao mã sau đây biên dịch?Tại sao đoạn mã này biên dịch?

#include <stdio.h> 

int main(void) { 
    getchar; 
} 
+20

Vì lỗi của nó? –

+1

@Xinxua - +1/đồng ý –

+0

Về cơ bản, nó tóm tắt cho dù 'getchar' được phép là macro hay không. Nếu có, mã có thể không chính xác. –

Trả lời

28

Bởi vì tên hàm là bí danh để con trỏ chức năng đối với những chức năng, mà là bản thân các giá trị giống như số nguyên .. Đây là ngữ nghĩa rất giống với

#include <stdio.h> 

int main(void) { 
    42; 
} 

Đó là hợp lệ nhưng vô nghĩa.

+2

Và rất khó chịu !!!! gõ, "int x = getX" thay vì "x = getX()" sẽ làm việc khá vui vẻ và đặt một số giá trị địa chỉ ngẫu nhiên vào x. –

+0

Tôi ghét C.> _ <[phụ 15 char] – missingfaktor

+1

@Rahul: Đó không phải là một thái độ * rất giống * đa ngôn ngữ! – Tarydon

13

Lý do cùng 1; sẽ biên dịch, getchar chỉ là một địa chỉ để một hàm. Kết quả được đánh giá, sau đó bị loại bỏ. Trong đặc tả ngôn ngữ, nó được gọi là "tuyên bố biểu thức";

2

C là lạ, mã này biên dịch quá, nhưng nó segfaults mà cho hồ sơ, là segfault nhỏ nhất trong C lịch sử.

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