2013-07-21 30 views
5

Trong C++, chúng ta thường kiểm tra một con trỏ dù là null hay không, tôi chỉ biết chúng ta nên sử dụngNULL == trỏ

if(NULL == ptr) 

thay vì:

if(ptr == NULL) 

Tôi muốn biết tại sao?

Trong phần bổ sung, nếu chúng ta muốn khởi tạo ptr thành rỗng, chúng ta có nên sử dụng ptr = NULL hoặc ptr = 0 không? có, tôi biết trong C + +, chúng tôi thường sử dụng ptr = nullptr, tôi muốn biết tại sao chúng ta sẽ làm như thế này chỉ muốn thống nhất mã? nhờ

+6

Tôi thường viết 'if (! Ptr)'. Nó ngắn hơn và ít dư thừa hơn. – glglgl

+0

Tôi ít nhầm lẫn ở đây, cho dù câu hỏi của bạn là lý do tại sao bạn không thể sử dụng 'NULL == ptr' thay vì' ptr == NULL' hoặc câu hỏi của bạn là tại sao bạn không thể sử dụng '=' thay vì '== '? – Ravi

+0

Tôi đã hỏi hai câu hỏi – minicaptain

Trả lời

12

Đó là một phong cách mã hóa (tên Yoda Conditions) để tránh phải viết = thay vì == trong an-tuyên bố nếu, đó là hợp lệ để sử dụng phân = trong một lệnh if-, nhưng nó thường không phải những gì bạn muốn.

Cá nhân, tôi không thích sử dụng như thế này bởi vì nó khó đọc và trình biên dịch hiện đại sẽ cảnh báo bạn khi bạn sử dụng = trong câu lệnh if.

Cũng lưu ý rằng:

  1. if(ptr == NULL) là như nhau với if(!ptr).
  2. C++ 11 giới thiệu nullptr để thay thế bằng cách sử dụng NULL. Vì vậy, để khởi tạo một con trỏ null, nó ưa thích để sử dụng ptr = nullptr

Về lý do tại sao sử dụng nullptr qua NULL:

Trước khi C++ 11, NULL thường thực hiện trong nội bộ như #define NULL 0, nhưng vấn đề là, 0 là cũng là số nguyên không. Nó có thể gây rắc rối trong một số tình huống. Ví dụ:

void func(int n); 
void func(char *s); 

func(NULL); //call which function? 

Mặc dù Auther ngụ ý rằng NULL là một loại con trỏ, nhưng trình biên dịch chỉ biết gọi func(0). Vì vậy, phiên bản đầu tiên sẽ được gọi.

Sử dụng func(nullptr), trình biên dịch sẽ biết đó là con trỏ và gọi phiên bản thứ hai.

+0

+1, nhưng tôi sẽ chỉ ra rằng vấn đề là '=' là * gán * ngay cả trong điều kiện - điều này thường gây nhầm lẫn cho người mới bắt đầu. Điều này luôn luôn được giả định trong câu trả lời này, nhưng không bao giờ được nêu rõ ràng. –

+1

Đó là 'nullptr', không phải' null_ptr'. –

+0

có trong câu hỏi thứ hai của tôi, tôi biết chúng ta nên sử dụng nullptr, tôi muốn biết tại sao? chỉ muốn hợp nhất kiểu mã? – minicaptain

1

Sử dụng bình đẳng yoda nó ngăn ngừa một số lỗi nhất định như sử dụng một đơn = hoặc nơi trình biên dịch cố gắng xác định số nguyên từ con trỏ thông minh.

Đã được biết

Tôi đã dành hai ngày theo dõi lỗi đó vì họ nghĩ rằng yoda là một ý tưởng tồi.

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