Tôi sẽ bắt đầu với điều này: tính nhất quán là vua, quyết định ít quan trọng hơn tính nhất quán trong cơ sở mã của bạn.
Trong C ++
NULL được định nghĩa là 0 hoặc 0L trong C ++.
Nếu bạn đã đọc Ngôn ngữ lập trình C ++, Bjarne Stroustrup gợi ý sử dụng 0
rõ ràng để tránh NULL
macro khi thực hiện bài tập , tôi không chắc liệu anh ta có làm như vậy với các so sánh hay không, đã một thời gian kể từ khi tôi đọc cuốn sách, tôi nghĩ anh ta đã làm if(some_ptr)
không có một so sánh rõ ràng nhưng tôi mờ về điều đó.
Lý do cho điều này là vì NULL
macro là lừa đảo (vì gần như tất cả các macro) nó thực sự là 0
theo nghĩa đen, không phải là một loại duy nhất như tên cho thấy nó có thể. Tránh macro là một trong những hướng dẫn chung trong C ++. Mặt khác, 0
trông giống như một số nguyên và nó không phải là khi so sánh với hoặc được gán cho con trỏ. Cá nhân tôi có thể đi một trong hai cách, nhưng thông thường tôi bỏ qua so sánh rõ ràng (mặc dù một số người không thích điều này có lẽ là lý do tại sao bạn có một cộng tác viên đề nghị thay đổi bằng mọi cách).
Bất kể cảm xúc cá nhân, điều này phần lớn là một sự lựa chọn ít xấu xa nhất vì không có một phương pháp đúng đắn.
Điều này là rõ ràng và là một thành ngữ phổ biến và tôi thích nó, không có cơ hội vô tình gán một giá trị trong khi so sánh và nó đọc rõ ràng:
if(some_ptr){;}
Điều này là rõ ràng nếu bạn biết đó some_ptr
là một loại con trỏ, nhưng nó cũng có thể trông giống như một so sánh số nguyên:
if(some_ptr != 0){;}
Điều này rất rõ ràng, trong những trường hợp thông thường, nó có ý nghĩa ... Nhưng đó là một sự trừu tượng bị rò rỉ, NULL
thực sự 0
theo nghĩa đen và cuối cùng có thể dễ dàng bị lạm dụng:
if(some_ptr != NULL){;}
C ++ 0x có nullptr hiện là phương thức ưa thích vì nó rõ ràng và chính xác, chỉ cần cẩn thận về việc gán ngẫu nhiên:
if(some_ptr != nullptr){;}
Cho đến khi bạn có thể di chuyển sang C ++ 0x, tôi sẽ cho rằng thật lãng phí thời gian để lo lắng về phương pháp nào bạn sử dụng, tất cả đều không đủ, đó là lý do tại sao nullptr được phát minh (cùng với các vấn đề lập trình chung đưa ra chuyển tiếp hoàn hảo .) Điều quan trọng nhất là duy trì tính nhất quán.
Trong C
C là một con thú khác nhau.
Trong C NULL có thể được định nghĩa là 0 hoặc là ((void *) 0), C99 cho phép thực hiện các hằng số con trỏ null được xác định. Vì vậy, nó thực sự đi vào định nghĩa của NULL và bạn sẽ phải kiểm tra nó trong thư viện chuẩn của mình.
Macro rất phổ biến và nói chung chúng được sử dụng rất nhiều để bù đắp cho những thiếu sót trong hỗ trợ lập trình chung trong ngôn ngữ và những thứ khác. Ngôn ngữ đơn giản hơn nhiều và sự phụ thuộc vào bộ xử lý trước phổ biến hơn.
Từ quan điểm này, tôi có thể khuyên bạn nên sử dụng NULL
định nghĩa macro trong C.