it-swarm-vi.com

int * i; hoặc int * i; hoặc int * i;

Phương pháp yêu thích của bạn để khai báo một con trỏ là gì?

int* i;

hoặc là

int *i;

hoặc là

int * i;

hoặc là

int*i;

Hãy giải thích tại sao.

xem thêm: http://www.stroustrup.com/bs_faq2.html#whitespace

30
lesmana

Nếu bạn viết:

int* i, j, k;

bạn hiểu nhầm rằng tất cả i, j và k là con trỏ tới int.

Vì vậy, tôi cho rằng nó vượt trội hơn khi sáp nhập * vào tên biến.

76
Randall Schulz

Tôi thích int* i bởi vì i có loại "con trỏ tới int" và tôi cảm thấy điều này làm cho nó đồng nhất với hệ thống loại. Tất nhiên, hành vi nổi tiếng xuất hiện, khi cố gắng xác định nhiều con trỏ trên một dòng (cụ thể là dấu hoa thị cần được đặt trước mỗi tên biến để khai báo một con trỏ), nhưng tôi chỉ đơn giản là không khai báo con trỏ theo cách này. Ngoài ra, tôi nghĩ rằng đó là một khiếm khuyết nghiêm trọng trong các ngôn ngữ kiểu C.

62
Tamás Szelei

Đối với C, nơi chúng tôi không tập trung mạnh vào các loại, tôi thích:

int *i;

Bởi vì nó có một điểm nhấn trên int, không phải con trỏ. int là gì? *i là số nguyên.

23
alternative

Tôi đã ưa thích int* i trong nhiều năm. Tuy nhiên, có một lập luận mạnh mẽ cho int *i bởi vì khi sử dụng kiểu cũ, bạn vẫn phải nhớ quy tắc khai báo nhiều lần:

int* a, *b; // not int* a, b;

Bởi vì bạn phải nhớ quy tắc này, bạn sẽ không đạt được bất kỳ đơn giản nào nhưng tôi cũng không nói nó phức tạp hơn. Tránh nhiều khai báo trên một dòng chỉ là một cách khác để nói rằng bạn nhớ quy tắc này. Sự khác biệt giữa hai phong cách là moot.

Tuy nhiên, ngay cả khi tôi sử dụng nó, tôi cảm thấy hơi ngớ ngẩn khi giả vờ cú pháp khai báo C hoạt động khác với nó, bằng cách đặt dấu hoa thị bên cạnh loại chứ không phải là biến mà nó bị ràng buộc về mặt cú pháp.

Tôi không mua cái đó nhấn mạnh loại con trỏ (cho i) trong khi loại kia nhấn mạnh kiểu int (cho *i), nhưng đó có thể là sau 15 năm sử dụng C và C++, nó chỉ khi tôi nhìn vào nó, mà không phải suy nghĩ về đó là một cái gì đó mà hầu hết những người mới bắt đầu hỏi câu hỏi này chưa thể làm được.

Ngoài ra, ngay cả khi được ưu tiên, tôi cũng không cảm thấy ngại khi đọc/viết mã theo kiểu khác. Kiên định, bla bla blah.

Thậm chí không cần đề cập đến int * i.

7
Roger Pate

Tôi thích cái đầu tiên. Nó là tự nhiên như là một con trỏ là một phần của loại.

Khi tôi sử dụng C #, nó xử lý các loại theo cách trực quan hơn C, do đó không có vấn đề gì khi khai báo một số con trỏ trong cùng một câu lệnh:

int* a, b, c; // three pointers
6
Guffa

Tôi thích int* i (C++ - kiểu).
[.__.] Tôi tránh khai báo nhiều biến trong một câu lệnh do sự mơ hồ về kết quả hình ảnh (int* i, j).

Xem thêm Câu hỏi thường gặp về Phong cách và Kỹ thuật C++ của Bjarne Stroustrup để biết lý do.

5
Archimedix

Nếu bạn muốn khai báo nhiều biến nhưng không muốn lặp lại dấu hoa thị:

template <typename T>
struct pointer_to
{
    typedef T* type;
};

pointer_to<int>::type p1, p2, p3;

(Như bạn có thể thấy bên trong mẫu struct, tôi thích int* i Phong cách.)

Và đây là một giải pháp tổng quát hơn:

template <typename T>
struct identity
{
    typedef T type;
};

identity<int*>::type p1, p2, p3;

Cái này hoạt động với bất kỳ "loại có vấn đề" nào, ví dụ như mảng và tham chiếu:

identity<int[10]>::type a1, a2, a3;

identity<int&>::type r1(*p1), r2(*p2), r3(*p3);
4
fredoverflow

Tôi sẽ đi cho int* i; vì phần thứ nhất biểu thị loại biến (con trỏ đến int), trong khi phần thứ hai biểu thị tên (i). Nó sẽ không có ý nghĩa với tôi rằng loại là int và tên là *i. Cũng thế, int * i; trông giống như nhân với tôi.

2
Allon Guralnek

Trong khai báo tôi sử dụng int * i;, bạn đọc nó là i is a pointer to an integer.

Con trỏ đóng góp cho cả loại và biến vì vậy nó phải ở giữa.

Đó là một điều tốt để tránh khai báo nhiều thứ trên cùng một dòng: int * i, j;

2
Tamara Wijsman

Tôi thực sự sử dụng cả ba quy ước trong các trường hợp cụ thể. Thoạt nhìn tôi có vẻ không nhất quán, nhưng ...

  • int * khi định danh không có mặt, để củng cố một cách trực quan rằng tên không có mặt.
  • int* intptr trên typedefs và các khai báo tương tự để củng cố trực quan rằng đó là một phần của loại. Tương tự với khai báo con trỏ hàm: (int* (*foo)(int))
  • int *identifierclass &identifier trên các tham số chức năng để củng cố trực quan rằng tham số đó có khả năng được gọi là tham số "out".
  • const int * const * const bất cứ khi nào tôi sử dụng c-v vòng loại.
  • int * foo; trên tờ khai địa phương.

Tôi đoán tôi hơi thiên về trực quan.

1
greyfade

Không có loại con trỏ trong C! Vì vậy, "int *" có nghĩa là không có gì. Dấu hoa thị luôn bị ràng buộc với phần tử được viết bên phải của nó, nó thuộc về phần tử bên phải. "* i" là một số nguyên. Và vì * i là một int, nên theo sau tôi là một con trỏ tới int. Đó là logic đằng sau nó và đó là lý do tại sao "int * i" là giải pháp khả thi duy nhất. Mọi thứ khác chỉ là ảo ảnh (được trình biên dịch tự động sửa trong hầu hết các trường hợp). Trong C++ và C # có gì đó khác biệt. Nhưng đối với C chỉ có một cuốn kinh thánh: "Dennis M. Ritchie: Ngôn ngữ lập trình C". Dennis (R.I.P.!) Đã viết nó: "int * i". Không cần phải hỏi điều này.

1
Lexi Pim