B [2] neden yanlıştır?


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

kümeler

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

neden b[2]yanlış

Eğer A==Bve A==C, bu ima etmiyor B==Cmu?



Şimdi hatamı görüyorum ve işaretçileri karşılaştırırken ilk kez kafamı karıştırdığım için deja vu hissim var.
NoComprende

Yanıtlar:


14

Bu ifadede

s.c_str()==""

iki işaretçi (adres) karşılaştırılmıştır. Birincisi, döndürülen işaretçi s.c_str()ve ikincisi, dizgi değişmezinin ilk karakterinin (sıfır karakter sonlandırma) işaretçisidir "".

Adreslerin farklı olduğu açıktır (dizgi değişmezinin statik depolama süresine sahip olduğunu da unutmayın).

Beklenen sonucu almak için bunun yerine yazmalısınız

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

Bu iki ifadeye gelince

s==""

ve

s==s.c_str()

standart std :: string sağ işlenen için operatörü == aşırı yüklediğinden karşılaştırılan dizeler vardır.


Standart , son durumda işaretçilerin farklı olmasını garanti ediyor mu? Olabileceklerini anlıyorum.
Jeffrey

Sadece UB olması gerektiğini ekleyebilir miyim. "dizgi değişmezi sonuçlarla karşılaştırma belirtilmemiş davranış"
Roout

@Jeffrey Guarantteess çünkü en azından dize boş. :) Ancak her durumda std :: string sınıfı yapıcısının argümanının bir kopyasını kullanır.
Moskova'dan Vlad

1
@Roout - "UB" tanımsız davranış anlamına gelir . Bu, dil tanımının ** programının davranışının ne olduğunu söylemediği anlamına gelir . Tanımlanmamış davranışa sahip bir program geçerli bir C ++ programı değil. "Belirtilmemiş davranış", orada birkaç alternatifleri vardır ve standart program geçerlidir seçilecek olanların hangi söylemez ve uygulama alternatifleri herhangi birini seçebilirsiniz..
Pete Becker

UB ile bir program @PeteBecker olduğu (başarıyla derler ve çalıştırmak olabilir anlamda en azından) geçerli C ++ program hala.
trolley813
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.