ทำไม b [2] เท็จ?


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

ชุด

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

ทำไมb[2]เท็จ

ถ้าA==BและA==Cนั่นไม่ควรบอกเป็นนัย ๆB==C?



ฉันเห็นความผิดพลาดของฉันในตอนนี้และฉันรู้สึกว่า Deja vu ไม่ใช่ครั้งแรกที่ฉันสับสนในการเปรียบเทียบพอยน์เตอร์
NoComprende

คำตอบ:


14

ในการแสดงออกนี้

s.c_str()==""

มีการเปรียบเทียบสองพอยน์เตอร์ (ที่อยู่) คนแรกคือตัวชี้กลับมาs.c_str()และเป็นคนที่สองคือตัวชี้ไปที่ตัวอักษรตัวแรก (ตัวอักษร terminaring ศูนย์) ""ของตัวอักษรสตริง

จะเห็นได้ว่าที่อยู่แตกต่างกัน (โปรดจำไว้ว่าตัวอักษรสตริงมีระยะเวลาการจัดเก็บแบบคงที่)

เพื่อให้ได้ผลลัพธ์ที่คาดหวังคุณควรเขียนแทน

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

สำหรับสำนวนทั้งสองนี้

s==""

และ

s==s.c_str()

ดังนั้นจึงมีการเปรียบเทียบสตริงเนื่องจากคลาสมาตรฐาน std :: string มีตัวดำเนินการมากเกินไป == สำหรับตัวถูกดำเนินการที่ถูกต้อง


มาตรฐานรับประกันตัวชี้จะแตกต่างกันหรือไม่ในกรณีสุดท้าย ฉันเข้าใจว่าพวกเขาสามารถ
เจฟฟรีย์

สามารถเพิ่มได้ว่าควรเป็น UB เท่านั้น "การเปรียบเทียบกับผลลัพธ์ที่แท้จริงของสตริงในพฤติกรรมที่ไม่ระบุ"
Roout

@Jeffrey มันรับประกันเพราะอย่างน้อยสตริงว่างเปล่า :) แต่ในกรณีใด ๆ class std :: string ใช้สำเนาของอาร์กิวเมนต์ของนวกรรมิก
วลาดจากมอสโก

1
@Roout - "UB" หมายถึงพฤติกรรมที่ไม่ได้กำหนด "หมายความว่าคำจำกัดความภาษาไม่ได้บอกคุณว่าพฤติกรรมของโปรแกรม **คืออะไรโปรแกรมที่มีพฤติกรรมที่ไม่ได้กำหนดนั้นไม่ใช่โปรแกรม C ++ ที่ถูกต้อง" พฤติกรรมที่ไม่ระบุ "หมายความว่า มีหลายทางเลือกและมาตรฐานไม่ได้บอกคุณว่าจะเลือกตัวเลือกใดโปรแกรมนี้ใช้ได้และการใช้งานสามารถเลือกตัวเลือกใดก็ได้
Pete Becker

@PeteBecker โปรแกรมที่มี UB ยังคงเป็นโปรแกรม C ++ ที่ถูกต้อง (อย่างน้อยก็ในแง่ที่ว่าคอมไพล์สำเร็จและสามารถรันได้)
รถเข็น 813
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.