2009-10-22 67 views
7

Trong đoạn mã sau, lợi ích của việc sử dụng (!!p) thay vì (p != NULL) là gì?Tại sao/Khi nào sử dụng (!! p) thay vì (p! = NULL)

AClass *p = getInstanceOfAClass(); 
if(!!p) 
    // do something 
else 
    // do something without having valid pointer 
+22

Tôi tự hỏi có gì sai với chỉ 'if (p)'. – GManNickG

+1

Hoàn toàn không có gì. :) – Twisol

+3

Bạn nên luôn luôn là các toán tử đáng ngờ bị quá tải. Có thể '! P' hoặc'! = 'Có những hành vi đặc biệt. – Kobi

Trả lời

9

Đó là vấn đề về phong cách, trên thực tế chúng tương đương nhau. Xem this very similar question để thảo luận.

IMO so sánh với con trỏ null là rõ ràng hơn.

3

Theo tôi có thể thấy, đó chỉ là một cách ngắn hơn để chuyển đổi nó thành giá trị boolean. Nó áp dụng! hai lần, mặc dù, trong khi p != NULL hiện một so sánh. Vì vậy, tôi đoán lợi ích chỉ ngắn hơn mã, mặc dù khó hiểu hơn nếu bạn không biết những gì !!p là nghĩa vụ phải có nghĩa là.

11

Nó là khá nhiều giống nhau, mặc dù tôi xem xét !!p là phong cách xấu, và thường chỉ ra một coder cố gắng để được thông minh.

+4

Nếu bạn mất một giờ để viết mã thông minh, bạn sẽ mất hai giờ để hiểu nó sau một vài tuần. – Twisol

+2

Tôi hoàn toàn đồng ý. Nó nên đã đọc "cố gắng để được thông minh, và không" – Wernsey

0

Họ đều giống nhau, nhưng tôi khuyên bạn nên sử dụng

NULL != p 

Nó là dễ đọc hơn.

+0

Đó là gì, nhưng sở thích cá nhân và phong cách. –

+4

Khả năng đọc của nó có thể gây tranh cãi. Cá nhân, tôi thấy nó * ít * có thể đọc được, đơn giản chỉ vì nó không đọc tự nhiên. Tôi thường nói 'nếu p không phải là NULL' không 'nếu NULL không phải là p'. –

+3

Có nhưng nó ngăn chặn mọi người thiếu một "p = NULL" sai lầm khi trình biên dịch sẽ nhận "NULL = p". – ChrisBD

-2

Làm !! KHÔNG sử dụng phủ định kép. Một lập luận đơn giản là vì C++ là một tập hợp con tiếng Anh có giới hạn và tiếng Anh không có sự phủ định kép, nên các loa tiếng Anh sẽ gặp rất nhiều khó khăn khi phân tích những gì đang diễn ra.

+1

Tôi thấy những gì bạn đã làm ở đó ... – Twisol

+0

Ngoại trừ nếu bạn cũng đã học các lớp tiếng Latinh, sau đó phủ định kép - tùy thuộc vào ngữ cảnh - không hủy bỏ, nhưng ý nghĩa của từ khóa được khuếch đại. – MP24

+2

Ngoại trừ điều đó! (C++ là một tập con giới hạn của tiếng Anh). – outis

-1

Không có sự khác biệt trong ví dụ đã cho.

Tuy nhiên, giả định rằng điều này áp dụng cho tất cả các trường hợp không chính xác. a = không phải b không giống như a = b, theo các loại số nguyên có liên quan.

Trong C, 0 là sai. Mọi thứ trừ 0 đều đúng. Nhưng not 01 và không có gì khác. Trong C++, true là 1 là số nguyên, không chỉ cho tương thích ngược với C, mà vì 1 không phải là 01 là giá trị phổ biến nhất được sử dụng để biểu thị đúng trong các loại bool, bao gồm official C bool typeBOOL được sử dụng Win32.

Trong khi đối với các mã ví dụ được đưa ra, !!p là không cần thiết bởi vì kết quả được đúc để một bool để đánh giá về tình trạng if, điều đó không loại trừ việc sử dụng cho các mục đích !! đúc boolean để các giá trị số nguyên mong đợi. Cá nhân trong ví dụ này, để tối đa hóa xác suất mà loại thay đổi và ngữ nghĩa là rõ ràng, tôi sẽ sử dụng NULL != p hoặc p != NULL để làm cho nó hoàn toàn rõ ràng những gì có nghĩa là.

Kỹ thuật này được gọi là thành ngữ hai đoạn và this guy provides some good justifications.

+0

Các biện minh đó không hợp lệ trong trường hợp này. –

+0

Thực tế trong ngữ cảnh này nếu (p) và nếu (!! p) * là * giống nhau. Điều này là do điều kiện của 'if' được chuyển đổi thành bool và thử nghiệm, đó chính xác là những gì !! kết thúc. Trả lời câu trả lời được liên kết, trong C++, các hạt nhân có thể đưa giá trị của chúng vào một bool. –

+0

"Trong khi cho mã ví dụ được đưa ra, !! p rõ ràng là không cần thiết," có lẽ tôi nên làm cho điều này rõ ràng hơn. –

7

tôi điều bình luận ban đầu GMAN của nên là câu trả lời được chấp nhận:

Tôi tự hỏi có gì sai với chỉ if (p)

Vấn đề là: là sai với nó, và này nên là cách ưu tiên. Trước hết, !!p là “quá thông minh”; nó cũng hoàn toàn không cần thiết và do đó rất tệ (chú ý: chúng ta đang nói về con trỏ trong câu lệnh if ở đây, vì vậy bình luận của Anacrolix, trong khi thường hợp lệ, không áp dụng ở đây!).

Điều tương tự cũng xảy ra với p != NULL. Trong khi điều này là có thể, nó chỉ là không cần thiết. Đó là mã nhiều hơn, mã hoàn toàn thừa và do đó mã này làm cho mã tồi tệ hơn. Điều thực sự nhất mà Jeff Atwood từng nói là “mã tốt nhất không có mã nào cả.” Tránh cú pháp thừa. Dính vào mức tối thiểu (vẫn chuyển tải ý nghĩa đầy đủ; if (p)là hoàn tất).

Cuối cùng, if (p) được cho là cách thành ngữ nhất để viết điều này trong C++. C++ uốn cong về phía sau để có được hành vi tương tự này đối với các loại khác trong ngôn ngữ (ví dụ: luồng dữ liệu), với chi phí của một số quirks rất lạ. Phiên bản tiếp theo của tiêu chuẩn thậm chí còn đưa ra một cú pháp mới để đạt được hành vi này trong các kiểu do người dùng định nghĩa.

Đối với con trỏ, chúng tôi nhận được như nhau miễn phí. Vì vậy, sử dụng nó.

/EDIT: Về rõ ràng: sharptooth viết rằng

IMO so sánh với con trỏ null là rõ ràng hơn.

Tôi cho rằng đây là sai khách quan: if (p) rõ ràng hơn. Không có cách nào có thể là tuyên bố này có thể có nghĩa là bất cứ điều gì khác, không phải trong bối cảnh này cũng không phải trong bất kỳ khác, trong C + +.

+0

Tôi làm theo điều này. nếu (p) làm tất cả, làm nó ngắn, không rõ ràng.(Và một số cũng có thể gọi lợi ích bổ sung của việc không sử dụng 'NULL', vì họ thích '0') – stijn

+2

Tôi thích đặt trước nếu (x) cho các kiểu boolean, và nếu (x! = Nullptr/* hoặc NULL * /) cho các loại con trỏ. Bằng cách đó con trỏ của bạn kiểm tra nổi bật trong mã và dễ tìm kiếm. – Bill

+0

"Không có cách nào có thể tuyên bố này có thể có nghĩa là bất cứ điều gì khác" - Cũng không có cách nào nếu (p! = NULL) có thể có nghĩa là bất cứ điều gì nhưng p không bằng NULL, bất cứ điều gì NULL có thể được. –

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