2012-04-05 41 views
23

Dường như với tôi rằng toán tử mũi tên của C (->) là không cần thiết. Toán tử dấu chấm (.) Phải là đủ. Hãy lấy mã sau:Toán tử Arrow so với toán tử Dot

typedef struct { 
    int member; 
} my_type; 

my_type foo; 
my_type * bar; 
int  val; 

val = foo.member; 
val = bar->member; 

Chúng tôi thấy rằng toán tử mũi tên phải được sử dụng cho thanh điều khiển. Tuy nhiên, tôi muốn viết

val = bar.member; 

Không có sự mơ hồ về việc liệu tôi có cố gắng kéo 'thành viên' từ cấu trúc hoặc từ con trỏ đến cấu trúc hay không. Nhưng rất dễ sử dụng toán tử sai, đặc biệt khi mã tái cấu trúc. (Ví dụ, có lẽ tôi đang làm một số hoạt động phức tạp trên foo, vì vậy tôi di chuyển mã vào một hàm mới và chuyển một con trỏ tới foo). Tôi không nghĩ rằng tôi cần phải quan tâm cho dù foo là một con trỏ hay không; trình biên dịch có thể lo lắng về các chi tiết.

Vì vậy, câu hỏi: sẽ không đơn giản hơn để loại bỏ -> từ ngôn ngữ C?

+1

Câu hỏi này không phù hợp với định dạng Giải Đáp của chúng tôi. Chúng tôi hy vọng câu trả lời thường liên quan đến sự kiện, tài liệu tham khảo hoặc chuyên môn cụ thể; câu hỏi này có thể sẽ thu hút ý kiến, tranh luận, tranh luận, bỏ phiếu hoặc thảo luận mở rộng. – bzlm

+3

Hiện có hàng tỷ dòng mã C đang được sử dụng. Nó sẽ không đơn giản để loại bỏ bất cứ điều gì từ ngôn ngữ C. Điều đó nói lên, nhân chứng về sự vô đạo là A Good Thing. –

+6

Bạn nói đúng, không cần thiết. Đó là cú pháp đường cho '(* bar) .member'. Theo định nghĩa, chúng tôi không _need_ bất kỳ đường cú pháp nào. Sau đó, một lần nữa, chúng tôi không _need_ chức năng, một trong hai. chúng tôi _could_ chỉ làm mọi thứ với 'goto'. – jpm

Trả lời

3

Không, nó sẽ không được dễ dàng hơn để loại bỏ -> từ ngôn ngữ, vì lý do đơn giản là megatons mã sẽ phải được viết lại nếu nó được. Tuy nhiên, có thể xác định rằng p.x tương đương với p->x nếu p là một con trỏ. Đó sẽ là một sự thay đổi tương thích ngược vì mã đó hiện là bất hợp pháp.

+3

Có, nhưng như @ bta đề cập, nó sẽ là một thay đổi không khôn ngoan. '->' giúp đáng kể trong việc xác định biến nào là giá trị và đó là con trỏ, do đó có thể giúp duy trì khả năng quản lý bộ nhớ. – jpm

38

Toán tử 'mũi tên' là cú pháp đường. bar->member giống với (*bar).member. Một lý do cho sự khác biệt là khả năng bảo trì. Với toán tử mũi tên khác biệt với toán tử dấu chấm, nó trở nên dễ dàng hơn nhiều để theo dõi các biến nào là con trỏ và các biến nào không. Nó có thể là có thể luôn luôn sử dụng . và có trình biên dịch cố gắng làm điều đúng, nhưng tôi nghi ngờ rằng sẽ làm cho ngôn ngữ đơn giản hơn. Tin tưởng trình biên dịch để giải thích những gì bạn có nghĩa là thay vì những gì bạn theo nghĩa đen đã viết thường bị hỏng nặng.

+0

Không đề cập đến các lớp hoạt động như con trỏ (cung cấp '*' và '->' toán tử), nhưng trên đó '.' cũng là một hoạt động hợp lệ. – jpm

+2

@jpm: C không có lớp học. Tuy nhiên bạn có một điểm sâu sắc như thế này sẽ giới thiệu một sự không tương thích không cần thiết để C + + (mà vì lý do bạn nhà nước có lẽ sẽ không áp dụng quy ước đó). – celtschk