2011-07-26 60 views
10

thể trùng lặp:
What is the difference between these (bCondition == NULL) and (NULL==bCondition)?Ý nghĩa của NULL! = Giá trị trong C++ là gì?

tôi đang trải qua một mảnh C++ và đã xem qua một mã như

if (NULL != threadInfo) 
{ 
    ... 
    ... 
} 

Tôi chỉ thắc mắc là có bất kỳ sự khác biệt giữa việc sử dụng cụm từ

if (threadInfo != NULL) 
{ 
    ... 
    ... 
} 

những gì được nói ở trên. Trong khi đọc đầu tiên đọc "Nếu NULL không bằng với ThreadInfo" và lần thứ hai đọc "Nếu threadInfo không bằng NULL". Với tôi cái thứ hai có ý nghĩa hơn.

+1

Khi bạn thử điều này, bạn nhận thấy sự khác biệt nào? – marto

+4

Bạn sẽ thấy rất nhiều 'if (Constant == variable)' trong c/C++ bởi vì bạn sẽ nhận được một lỗi biên dịch nếu bạn rời khỏi lệnh thứ hai = off, cố gắng gán cho một biểu thức không đổi bên trái. Có lẽ một cái gì đó tương tự? – asawyer

+0

Nó không tạo ra sự khác biệt, nó chỉ là một phương trình, bạn sẽ thấy nó chỉ hơn 2 giá trị ('if (true == true)') thay vì biến và giá trị. – Sander

Trả lời

14

Không, không có sự khác biệt. Trong trường hợp của == có thể có một số khác biệt. Vấn đề là nếu bạn vô tình viết = thay vì == trình biên dịch sẽ đưa ra một lỗi trong trường hợp đầu tiên.

if (threadInfo = NULL) //always false. The compiler will give you a warning at best 

if (NULL = threadInfo) //Compiler error 

Cá nhân tôi ghét thực hành đó và nghĩ tốt hơn là viết mã có thể đọc bằng ngôn ngữ bình thường của con người chứ không phải ngôn ngữ Yoda.

+6

+1, chắc chắn ít dễ đọc hơn và hoàn toàn không đạt được gì. Nếu bạn thường xuyên gõ '=' thay vì '==' và cũng có * không có gì * để cảnh báo bạn về nó, thì bạn có thể có vấn đề lớn hơn. – rid

+1

Cảnh báo là vô ích, bởi vì mã mẫu tạo ra một tấn dương tính giả. –

2

Không có sự khác biệt. Điểm của văn bản NULL != ... là nếu bạn thay vì thực hiện một lỗi đánh máy và viết NULL = ... mã sẽ không biên dịch. Nếu bạn có ... = NULL nó có thể là một nhiệm vụ hợp lệ và lỗi có thể không được chú ý (nhưng hầu hết các trình biên dịch phát hiện điều này và cảnh báo bạn). Ai đó đã từng cố gắng insert a backdoor into the Linux kernel using this technique.

Cũng lưu ý rằng hầu hết mọi người không mã như vậy.

0

Điều này thường được sử dụng như một quy ước và không có ý nghĩa riêng biệt nào.

Do phép gán xảy ra theo khoảng thời gian và NULL không thể gán, điều này bảo vệ chống lại số threadInfo = NULL sợ hãi khi bạn có nghĩa là lỗi threadInfo == NULL hoặc threadInfo != NULL.

Để cụ thể hơn, xem this wikipedia article section on left-hand comparisons

2

Không có sự khác biệt, TRỪ rằng tùy chọn đầu tiên không thể gõ sai như:

if (threadInfo = NULL) 
{ 
    ... 
    ... 
} 

Và một số người không biết làm thế nào để sử dụng công tắc biên dịch để kiểm tra điều này (và một số trình biên dịch không có chúng).

4

Nếu threadInfo là loại ghi đè operator != và chủ sở hữu của lớp đó không cung cấp chức năng miễn phí đối xứng xử lý trường hợp hai đối số được hoán đổi, có thể có sự khác biệt (có thể có nhu cầu để kích hoạt lập trình viên đó).

Nếu không, đó là vấn đề về hương vị. Có lẽ nó sẽ được ưa thích bởi những người viết if(42 == answer) thay vì if(answer == 42) - điều này bảo vệ bạn khỏi việc nhập sai toán tử gán thay vì kiểm tra bằng. Nhưng kể từ khi trình biên dịch hiện đại cảnh báo bạn khi bạn làm điều đó, nó gây tranh cãi cho dù cách tiếp cận này cung cấp bất cứ điều gì.

+0

Nhưng sự khác biệt là 'NULL! = ThreadInfo' sẽ không biên dịch, vì int không có toán tử! = Cho kiểu threadInfo. Tôi không nghĩ rằng có thể có sự khác biệt nếu threadInfo là một loại con trỏ? –

+0

@Douglas: Có thể có một toán tử 'function! = (Int, threadInfo_TYPE)' được định nghĩa trong cùng một không gian tên như 'threadInfo_TYPE', trong trường hợp đó nó sẽ tự động được xem xét do Koenig Lookup. – Jon

7

Đó là vì sự an toàn, vì vậy bạn không vô tình viết

threadInfo = NULL 

thay vì

threadInfo == NULL 

Đối với! = Không cần phải làm điều này, nhưng đó là nhất quán.

+5

Biến. Trình biên dịch. Cảnh báo. Trên. : | – GManNickG

+1

Tôi có cảnh báo trình biên dịch của mình. Tuy nhiên, tôi thích biết lý do đằng sau làm một cái gì đó thay vì chỉ làm điều đó bởi vì những người khác đang làm điều đó. Tôi vừa nói lý do - đó là một lý do hợp lệ - tôi không nói rằng bạn không nên cảnh báo ... –

0

Cả hai đều làm tương tự. Đây là quy ước kiểu được sử dụng để tránh nhập sai lầm như:

if (value=NULL) // assignment instead of == operator 
{ 
} 
1

Không có sự khác biệt, điều này được gọi là quy ước Yoda mã hóa.

if (NULL != threadInfo) 

tương đương với

if (threadInfo != NULL) 

if (threadInfo) 
0

Đây là tương đương chính xác về mặt logic.

Cái thứ hai có tính phức tạp hơn, khi người ta thấy cái đầu tiên được xem là an toàn hơn vì nó không cho phép viết (threadInfo = NULL) sai, dẫn đến lỗi.

0

Null là tham chiếu trong bộ nhớ không chứa gì, nhưng không có gì có địa chỉ để truy cập.

Bằng cách đó bạn có thể thực hiện so sánh phía sau null để kiểm tra xem một đối tượng nhất định có giá trị hay không.

0

Tôi không thấy bất kỳ sự khác biệt nào. Tuy nhiên, việc thực hành viết NULL == someVar sẽ giúp bạn tiết kiệm từ việc viết NULL = someVar nếu bạn quên nhập số = thứ hai.

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