Чому 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?



Зараз я бачу свою помилку, і я відчуваю дежавю, оскільки це не перший раз, коли я плутаю себе при порівнянні покажчиків.
NoComprende

Відповіді:


14

У цьому виразі

s.c_str()==""

там порівнюються два покажчики (адреси). Перший - вказівник, повернутий, s.c_str()а другий - вказівник на перший символ (закінчуючи нульовий символ) рядкового літералу "".

Очевидно, що адреси різні (майте також на увазі, що літеральний рядок має статичну тривалість зберігання).

Для отримання очікуваного результату слід замість цього написати

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

Щодо цих двох виразів

s==""

і

s==s.c_str()

то порівнюються рядки, оскільки стандартний клас std :: string перевантажив оператор == для правого операнда.


Чи гарантує стандарт , в останньому випадку покажчики відрізняються? Я розумію, що вони можуть бути.
Джефрі

Можна лише додати, що це має бути UB. "порівняння зі строковими буквальними результатами в неуточненій поведінці"
Roout

@Jeffrey Це гарантує, оскільки принаймні рядок порожній. :) Але в будь-якому випадку клас std :: string використовує копію аргументу свого конструктора.
Влад з Москви

1
@Roout - "UB" означає не визначену поведінку ". Це означає, що визначення мови не говорить вам про поведінку програми ** . Програма з невизначеною поведінкою не є дійсною програмою C ++." Не визначена поведінка "означає, що Є кілька альтернатив, і стандарт не говорить вам, хто з них буде обраний. Програма діє, і реалізація може вибрати будь-яку з альтернатив.
Pete Becker,

@PeteBecker програма з UB все ще є дійсною програмою C ++ (принаймні в тому сенсі, що вона успішно компілюється і може бути запущена).
trolley813
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.