Tại sao b [2] sai?


11
string s;
bool b[] = {s=="",  s==s.c_str(),  s.c_str()==""};

bộ

b[] = {true, true, false};

tại sao là b[2]sai

Nếu A==BA==C, điều đó không nên ngụ ý B==C?



Bây giờ tôi thấy lỗi của mình và tôi có cảm giác deja vu vì đây không phải là lần đầu tiên tôi bối rối khi so sánh con trỏ.
NoComprende

Câu trả lời:


14

Trong biểu thức này

s.c_str()==""

có so sánh hai con trỏ (địa chỉ). Cái đầu tiên là con trỏ được trả về bởi s.c_str()và cái thứ hai là con trỏ tới ký tự đầu tiên (ký tự bằng 0) của chuỗi ký tự "".

Rõ ràng là các địa chỉ là khác nhau (cũng lưu ý rằng chuỗi ký tự có thời lượng lưu trữ tĩnh).

Để có kết quả như mong đợi, bạn nên viết

std::strcmp( s.c_str(), "" ) == 0

Đối với hai biểu thức

s==""

s==s.c_str()

sau đó có các chuỗi được so sánh vì lớp tiêu chuẩn std :: string đã quá tải toán tử == cho toán hạng bên phải.


Liệu tiêu chuẩn đảm bảo con trỏ sẽ khác nhau, trong trường hợp cuối cùng? Tôi hiểu họ có thể.
Jeffrey

Chỉ có thể thêm rằng nó phải là UB. "so sánh với kết quả chuỗi ký tự trong hành vi không xác định"
Roout

@Jeffrey Nó bảo đảm vì ít nhất chuỗi trống. :) Nhưng trong mọi trường hợp, lớp std :: string sử dụng một bản sao của một đối số của hàm tạo của nó.
Vlad từ Moscow

1
@Roout - "UB" có nghĩa là hành vi không xác định ". Điều đó có nghĩa là định nghĩa ngôn ngữ không cho bạn biết hành vi của chương trình ** là gì. Một chương trình có hành vi không xác định không phải là chương trình C ++ hợp lệ." Hành vi không xác định "có nghĩa là Có một số lựa chọn thay thế, và tiêu chuẩn không cho bạn biết lựa chọn nào trong số đó sẽ được chọn. Chương trình này hợp lệ và việc triển khai có thể chọn bất kỳ lựa chọn thay thế nào.
Pete Becker

@PeteBecker một chương trình với UB vẫn chương trình C ++ hợp lệ (ít nhất là theo nghĩa là nó biên dịch thành công và có thể chạy được).
xe đẩy813
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.