Null là gì trong c

 - 

MyType x = __null;Tôi đã tra cứu nó và thấy rằng __null được gọi là "từ khóa trình biên dịch", mà tôi giả sử có nghĩa là nó được sử dụng nội bộ cho trình biên dịch. Tôi không hiểu tại sao NetBeans đề nghị thay đổi nó thành một từ khóa trình biên dịch.

Bạn đang xem: Null là gì trong c

Sự khác biệt giữa NULL và __null trong c ++ là gì?


__null là một g++ thứ bên trong có cùng mục đích với tiêu chuẩn nullptr được thêm vào trong C++ 11 (hoạt động nhất quán như một con trỏ, không bao giờ là số nguyên).

NULL được định nghĩa là 0, có thể được sử dụng ngầm là số nguyên, boolean, giá trị dấu phẩy động hoặc con trỏ, là một vấn đề khi nói đến độ phân giải quá tải, khi bạn muốn gọi hàm mất một con trỏ cụ thể.

Trong mọi trường hợp, bạn không nên sử dụng __null vì đó là chi tiết triển khai g++, vì vậy sử dụng nó đảm bảo mã không di động. Nếu bạn có thể dựa vào C++ 11 (chắc chắn bạn có thể đến bây giờ?), Hãy sử dụng nullptr. Nếu không, NULL là tùy chọn di động duy nhất của bạn.


53
28 thg 12, 2018ShadowRanger
NULL đã được chuyển từ C thành C++ và - trước C++ 11 - đã thông qua ý nghĩa C của nó:

cho đến C++ 11: Macro NULL là hằng số con trỏ null được xác định thực hiện, có thể là một giá trị biểu thức hằng hằng tích phân của kiểu số nguyên đánh giá bằng không.

Xem thêm: 1940 Mệnh Gì - Xem Tử Vi Tuổi Canh Thìn Nữ Mạng Sinh Năm 1940

C++ 11 sau đó đã giới thiệu một con trỏ null chuyên dụng theo nghĩa đen nullptr thuộc loại std::nullptr_t. Nhưng - có lẽ để tương thích ngược - macro NULL không bị xóa; định nghĩa của nó chỉ là một chút thoải mái trong các trình biên dịch bây giờ có thể định nghĩa nó là tích phân hoặc là kiểu con trỏ:

C++ 11 trở đi: một số nguyên có giá trị bằng 0 hoặc giá trị của kiểu std :: nullptr_t

Nếu bạn sử dụng NULL, thì bạn sẽ có hành vi được xác định theo thực hiện ở độ phân giải quá tải. Ví dụ, hãy xem xét đoạn mã sau với trình biên dịch sử dụng phiên bản tích phân của NULL- macro. Sau đó, một cuộc gọi sử dụng NULL làm tham số được truyền cho hàm có thể dẫn đến sự mơ hồ:

struct SomeOverload { SomeOverload(int x) { cout Vì vậy, nên sử dụng nullptr bất cứ khi nào bạn muốn thể hiện loại con trỏ.

Và không sử dụng __null, vì đây là hằng số dành riêng cho trình biên dịch, không di động; nullptr, ngược lại, hoàn toàn di động.


11
NULL là ký hiệu C cũ cho con trỏ null. Theo truyền thống, C++ đã sử dụng 0 cho các con trỏ null và kể từ tiêu chuẩn C++ 11 nullptr.

Xem xét rằng x dường như không phải là một con trỏ thì bạn không thể khởi tạo x thành một con trỏ null và biểu tượng __null có lẽ là một biểu tượng bên trong trình biên dịch cho null value (là một khái niệm không thực sự tồn tại trong C++ tiêu chuẩn).

Xem thêm: Soot Là Gì - Nghĩa Của Từ Soot

Nếu bạn muốn x được khởi tạo ở một số trạng thái mặc định, thì bạn phải dựa vào hàm tạo mặc định MyClass để khởi tạo các đối tượng và các biến thành viên của nó thành một số giá trị mặc định phù hợp.