2012-01-05 48 views
6

Đi qua EASTL, tôi stumbled trên một dòng đặc biệt của mã. Các liên kết sau đây cho thấy các tập tin với số dòng của lãi 1870.Sự khác biệt giữa! (X < y) and x > = y trong C++?

https://github.com/paulhodge/EASTL/blob/master/include/EASTL/algorithm.h

Mã tại dòng này là if(!(value < *i)). Bình luận nói rằng "chúng tôi luôn thể hiện sự so sánh giá trị về mặt số < hoặc ==" mà không có bất kỳ lời giải thích nào về lý do tại sao điều này là như vậy.

Có bất kỳ lợi ích nào để viết so sánh như vậy không (có thể là vậy tôi bối cảnh mà tôi đang nhìn)? Nếu không, tại sao tác giả của EASTL cố tình viết nó theo kiểu thời trang đặc biệt này và thậm chí còn chăm sóc bình luận về nó? Sự nhất quán là lý do duy nhất ở đây?

+1

Trong dấu phẩy động, chúng khác nhau, khi so sánh với 'NaN' sẽ luôn trả về false. – Mysticial

+0

Tại sao bạn không hỏi anh ta? –

+0

Âm thanh như một bộ xử lý/trình biên dịch/tối ưu hóa kiểu trình biên dịch rất cụ thể. Mã này có được nhắm mục tiêu đến một bộ xử lý/trình biên dịch cụ thể hay không… –

Trả lời

11

Điều đó có nghĩa là bạn chỉ cần cung cấp <== cho các loại giá trị vùng chứa. Điều này cũng có nghĩa là bạn giảm số lượng biến đổi cho các loại đó (vì tất cả các thuật toán sử dụng !(a<b) có nghĩa là a>=b!(a==b) cho a!=b); nếu không, bạn có thể có >=!= trả lại kết quả không phù hợp.

8

Trong C++, bạn có thể quá tải toán tử < để nó hoạt động khác với đối diện của >=, do đó chúng không được đảm bảo tương đương.

Thêm vào đó, trong bất kỳ thực hiện IEEE dấu chấm động, NaN < NaN là sai, nhưng như vậy làNaN >= NaN, vì vậy !(NaN < NaN) là đúng mặc dù NaN >= NaN là sai.

1

Tôi thấy ít nhất một sự khác biệt. Nếu một trong những con số là QNAN (dấu chấm động 0/0) thì! (A < b) sẽ luôn trả về TRUE nếu bất kỳ a hoặc b là QNAN, trong khi nó sẽ luôn trả về false cho một> = b

+0

Thực ra, hành vi này khá khó chịu. Một trong các thuộc tính của '<', toán học, là đối xứng. Nghĩa là '! (A

+0

@SteveJessop: vâng, xin lỗi, đó là một chút tắt. Mối quan hệ thực sự là: '! (A a == b'. –

+0

@Matthieu: Đúng là phiền phức, nhưng định nghĩa của bạn về tính không đối xứng bị tắt. Hãy xem xét' a == b', rồi '!(a

1

Chỉ sử dụng toán tử nhỏ hơn, bạn có thể mô phỏng tất cả toán tử so sánh khác. Điều này làm cho nó phù hợp hơn và cho phép bạn sử dụng một tham số mẫu duy nhất khi bạn cần tham số hóa so sánh. Các thùng chứa và thuật toán được sắp xếp tiêu chuẩn sử dụng std::less<T> làm trình so sánh mẫu mặc định.

operation equivalent 
x < y  x < y 
x > y  y < x 
x <= y  !(y < x) 
x >= y  !(x < y) 
x == y  !(x < y) && !(y < x) 
x != y  (x < y) || (y < x) 

Đối với những hoạt động đặt hàng không quan trọng, việc thay thế nhà điều hành == trở nên đơn giản hơn và hiệu quả hơn.

+0

Thư viện chuẩn cũng sử dụng 'equal_to (==)' để kiểm tra bình đẳng. – visitor

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