"a" == "a"
biểu hiện này có thể mang lại true
hoặc false
; không có bảo đảm. Hai ký tự chuỗi "a"
có thể chiếm cùng một bộ nhớ hoặc chúng có thể tồn tại ở hai vị trí khác nhau trong bộ nhớ.
Tôi nghĩ rằng ngôn ngữ gần nhất trong C++ Standard là: "Cho dù tất cả các chuỗi ký tự là khác biệt (nghĩa là, được lưu trữ trong các đối tượng nonoverlapping) được thực hiện xác định" (C++ 11 §2.14.5/12). Không có yêu cầu hoặc hạn chế nào khác, do đó kết quả không được chỉ định.
"a" != "b"
biểu này phải nhường false
vì không có cách nào mà hai xâu có thể chiếm cùng một vị trí trong bộ nhớ: "a"[0] != "b"[0]
.
Khi bạn so sánh xâu theo cách này, bạn đang thực sự so sánh các con trỏ đến các yếu tố ban đầu trong mảng.
Bởi vì chúng ta đang so sánh con trỏ, so sánh quan hệ (<
, >
, <=
, và >=
) thậm chí còn nhiều vấn đề hơn so sánh bình đẳng (==
và !=
) bởi vì chỉ có một tập hạn chế so sánh con trỏ có thể được thực hiện bằng cách sử dụng quan hệ so sánh. Hai con trỏ chỉ có thể được so sánh theo quan hệ nếu chúng là cả hai con trỏ vào cùng một mảng hoặc con trỏ vào cùng một đối tượng.
Nếu hai "a"
xâu chiếm cùng một vị trí trong bộ nhớ, sau đó "a" < "a"
sẽ được xác định rõ và sẽ mang lại false
, bởi vì cả hai con trỏ trỏ đến các yếu tố ban đầu ('a'
) của cùng một mảng.
Tuy nhiên, nếu hai "a"
xâu chiếm địa điểm khác nhau trong bộ nhớ, kết quả của "a" < "a"
là undefined, vì hai con trỏ được điểm thành các đối tượng hoàn toàn không liên quan so sánh.
Vì "a"
và "b"
không bao giờ có thể chiếm cùng một vị trí trong bộ nhớ, "a" < "b"
luôn có hành vi không xác định. Điều này cũng đúng đối với các toán tử so sánh quan hệ khác. Nếu bạn đã làm, vì một lý do nào đó, muốn so sánh hai chuỗi ký tự và có kết quả được xác định rõ, bạn có thể sử dụng trình so sánh std::less
, cung cấp thứ tự khắt khe trên tất cả các con trỏ. Ngoài ra còn có std::greater
, std::greater_equal
và std::less_equal
so sánh.Cho rằng các chuỗi ký tự có cùng nội dung có thể không so sánh bằng nhau, tôi không biết tại sao người ta lại muốn làm điều này, nhưng bạn có thể.
Tại sao bạn cần thực hiện việc này? Đối với một giả mạo được bảo đảm, hãy thử 'assert (!" Message go here "); ' – chris
@chris: Sự tò mò cho một. Cũng cho một ý tưởng thực hiện lớp giống như enum. –
có thể trùng lặp của [Chênh lệch đầu ra trong gcc và turbo C] (http://stackoverflow.com/questions/3289354/output-difference-in-gcc-and-turbo-c) – kennytm