2010-07-22 19 views
20

Possible Duplicates:
How to check for equals? (0 == i) or (i == 0)
Why does one often see “null != variable” instead of “variable != null” in C#?Tại sao một số lập trình viên có kinh nghiệm viết so sánh với giá trị trước biến?

Tôi đã có một cái nhìn tại một hướng dẫn kỳ lạ ở đây và ở đó cũng như một số mã DirectX và nhận thấy rằng nhiều lập trình viên có kinh nghiệm C++ viết các biểu thức theo cách sau:

(<constant> == <variable>) 

hơn những gì trí tuệ thông thường của tôi có vẻ thích:

(<variable> == <constant>) 

Ví dụ: if (NULL == ptr) thay vì if (ptr == NULL). Tôi thích sự thay thế thứ hai, nếu không có lý do khác để lựa chọn trước đây, lý do của tôi là biến có vẻ là "nhận" kết thúc của biểu thức.

Nhưng tôi nghi ngờ tên cũ được sử dụng để tránh vô tình gán giá trị của hằng số cho biến bằng cách sử dụng = thay vì ==. Điều đó có đúng không?

+3

có, chính xác trên mã này mục thánh chiến tranh thường được kết hợp với mã hóa C++. –

+9

@Mark: bây giờ đã làm mọi người sử dụng sai thứ tự! (Gợi ý: những người lập trình thực sự không bao giờ nhầm lẫn = cho == ...!) –

+0

Điều duy nhất là tôi sẽ ngừng suy nghĩ về nó như biến "tiếp nhận" bất cứ điều gì trong các loại biểu thức này. – BobbyShaftoe

Trả lời

24

Vâng, đúng vậy. Đó là để phát hiện lỗi đánh máy của = thay vì ==.

2

Nó tránh được rằng bạn viết var = NULL. Viết NULL = var sẽ sinh ra lỗi. Vì vậy, bạn đúng :-)

7

của nó bởi vì bạn không thể gán một giá trị cho một hằng số, vì vậy nếu do nhầm lẫn bạn đặt = thay vì == trình biên dịch ném một lỗi, cảnh báo cho bạn

28

Đó từng là trường hợp, vâng. Tất nhiên, ngày nay hầu như tất cả các trình biên dịch cảnh báo về các bài tập trong điều kiện if(), do đó, lợi thế chỉ dành cho những người thường xuyên ngăn chặn cảnh báo.

+13

Và việc ngăn chặn các cảnh báo sẽ dẫn đến những vấn đề lớn hơn nhiều so với các bài tập ngẫu nhiên. –

+3

Khi hầu hết các tiêu chuẩn mã hóa hiện nay đều cho phép tạo các lỗi cảnh báo để mã sẽ luôn luôn biên dịch rõ ràng. Đây chỉ là xem xét phong cách cũ (và trên một lưu ý cá nhân tôi thấy nó khó khăn hơn để đọc vì nó không phải là một cách tự nhiên để suy nghĩ về sự vật). –

+0

Tôi tự hỏi nếu g + + có cảnh báo như vậy? Tôi không ngăn chặn cảnh báo, và tôi chưa bao giờ nhận được một nhiệm vụ cho các bài tập trong điều kiện. –

5

Đó là lý do phổ biến, cũng như đối số mà bạn không muốn đẩy hằng số ra phía xa bên phải của màn hình với biểu thức dài dòng. Đối số thứ hai chưa bao giờ có vẻ thuyết phục với tôi, và cái cũ không thực sự hợp lệ trong những ngày này, vì bất kỳ trình biên dịch tự tôn trọng nào cũng sẽ đưa ra cảnh báo (bạn biên dịch với cảnh báo-như-lỗi, phải không ?--) .

EDIT: Tôi vừa xem qua bản xem trước Xcode 4 mới và chỉ xem ví dụ mà họ đã chọn để minh họa cho tính năng "Khắc phục sự cố" mới của họ!

alt text http://devimages.apple.com/technologies/tools/images/new_autocorrect20100721.jpg

+3

Tôi ghét cảnh báo-như-lỗi! arrrg! – Gianni

+0

@Gianni: Tại sao chính xác? – ereOn

+0

Nó phá vỡ mã của tôi, tất cả quá thường xuyên, vì lý do ngu ngốc/ngớ ngẩn. Chắc chắn, có mã mà biên dịch mà không có bất kỳ cảnh báo là mong muốn, nhưng không cần thiết. Tôi nên hiểu rõ hơn về mã nên trông như thế nào và tôi có thể sống với những cảnh báo nào hơn là trình biên dịch. Bên cạnh đó, đôi khi tôi đặt #warning bản thân mình để nhắc nhở tôi về một cái gì đó mà nên được thay đổi hoặc tái yếu tố trong tương lai. – Gianni

4

Để nắm bắt sự khác biệt giữa việc chỉ định và so sánh.

Nếu bạn muốn tìm:

if (ptr == foo) 

nhưng gõ

if (ptr = foo) 

nếu vẫn sẽ là mã hợp lệ, vì ptr = foo sẽ đánh giá để kiểm tra boolean trên ptr sau khi nó đã được thiết lập với giá trị của foo. Rõ ràng, bạn không muốn điều này.

Tuy nhiên, tôi thấy nó gây tổn hại đến khả năng đọc đáng kể, và cho rằng hầu hết các IDE và tiền xử lý sẽ bắt được điều này, không bao giờ sử dụng kiểu này.

-2

Là một nhà phát triển java Tôi có xu hướng viết các biểu thức như thế này:

//primitive check 
    if(constant == variable) 

    //Object check 
    if(constant.equals(variable)) 

Điều này đặc biệt quan trọng đối với các đối tượng vì biểu thức không làm lỗi nếu biến là null. Nếu biểu thức được theo thứ tự khác, một biến null sẽ bị lỗi. Tôi duy trì tính nhất quán và làm theo thứ tự cho các nguyên thủy.

+0

Tôi nghĩ anh ấy đang nói về C++ nếu bạn có thể cung cấp một ví dụ trong bối cảnh đó thay thế. –

+0

Ồ, hãy bình chọn để thêm một số thông tin bổ sung, thô lỗ, thô lỗ. – Jay

+2

Bạn không bị bỏ phiếu vì đã thêm thông tin bổ sung, bạn sẽ bị bỏ phiếu vì đã thêm thông tin không liên quan. Câu hỏi này không phải là về Java. – GManNickG

7

Điều này đã được gọi là "Điều kiện Yoda"!

Xem ở đây https://stackoverflow.com/questions/2349378/new-programming-jargon-you-coined

Tôi thực sự thích rằng hạn vì:

if(Light::On == light) 

Reads như:

"If on is the light"

Như đã trình bày rồi, này được sử dụng để ngăn chặn chuyển nhượng không chính xác. Nó có thể được lập luận rằng thực hành này là cổ xưa dựa trên IDE hiện đại nhưng tôi vẫn nghĩ rằng đó là thực hành tốt.

+0

OK !!!!! Cảm ơn bạn!!!!!! –

1

Ghi nhận nhiệm vụ là lý do chính Các điều kiện Yoda được sử dụng, nhưng có những điều khác: Trong C++ toán tử được gọi trên toán hạng LHS. Vì các hằng số thường là const (duh) hoặc nguyên thủy, điều này hạn chế khả năng hoạt động không có tính nhạy cảm. Một ví dụ là = trên nguyên thủy, chẳng hạn như lý do phổ biến nhất định (1 = a), nhưng điều này sẽ bao gồm operator=() const hoặc bất kỳ toán tử nào được sử dụng cho các loại không phải POD.

1

Với một ngôn ngữ như VB 6.0 mà không không có phân biệt và toán tử so sánh,

a = 2

'sẽ biên dịch, cho dù bạn có nghĩa là một được gán 2 hoặc cho dù bạn đang so sánh một với 2 Nếu bạn có nghĩa là so sánh, có khả năng xảy ra lỗi thời gian chạy.

'Đối với chuyển nhượng nếu bạn luôn viết

a = 2

' Và đối với chuyển nhượng nếu bạn luôn viết

2 = a

'Bạn loại bỏ Compile-thành công và thời gian chạy kịch bản.

Nhưng, đây chỉ là mẹo: gợi ý trực quan không khả dụng khi bạn có biểu thức như

a = b 'So sánh hoặc gán?

C# có: - gán khác (=) & so sánh (==) ký hiệu - so sánh phải được bao bọc trong ngoặc đơn.

Sau đó, điều này sẽ không thành vấn đề.

0

Bởi vì họ biết những gì họ đang thực hiện: P

0

Bạn nói đúng - đó là để kích hoạt một lỗi biên dịch nếu bạn nhập nhầm "==" là "=", kể từ khi chuyển nhượng sẽ luôn luôn trở thành sự thật. Trong khi điều này thường sẽ dễ dàng nhận thấy và gỡ lỗi, một lần trong một thời gian nó sẽ biến thành một rất khó để phát hiện lỗi, nghĩ về điều này:

#define OK 2 // Or something... 
[...] 
while(status = OK){ 
    // This loop will never end 
    // Even if you change the value of status within it 
    [...] 
} 

Đó có thể là một lỗi khó chịu để tìm kiếm, đặc biệt là nếu khối thuộc về tuyên bố vi phạm là dài (hãy tưởng tượng tìm kiếm tất cả các lý do có thể có tại sao trạng thái luôn ở trạng thái OK).

Nếu mặt khác bạn sử dụng:

while(OK = status){ 

Điều đó sẽ ném một lỗi biên dịch, vì bạn không thể gán một giá trị cho một hằng số.

Thực hành này đôi khi được gọi là điều kiện Yoda, vì nó juxtaposes đối tượng và chủ đề. Giống như "nếu trạng thái là OK" so với "nếu OK là trạng thái" và "bầu trời có màu xanh" so với "màu xanh dương là bầu trời" - thứ hai là thứ mà Yoda có thể nói.

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