Gönderen Konu: C++ String İfade Karşlaştırması  (Okunma sayısı 334 defa)

Çevrimdışı volkanunal

  • Üye
  • **
  • İleti: 39
C++ String İfade Karşlaştırması
« : 05 Ağustos 2017, 00:02:55 »
Merhabalar , normal şartlarda derleyiciler her string için ayrı bir bellek oluşturup daha sonra bu bellekten çıktıyı veriyorlar diye biliyordum ve kıyaslarken farklı adreslerde gösterildiği için karşılaştırma yaparken else bloguna düşmesini bekliyordum ama "ok" çıktısını aldım , bu yanlış değil midir?

Şöyle bir deneme sonucu

if("volkan"=="volkan") cout<<"ok"; else cout<<"no";

Doğrusunun böyle olması gerekmez miydi?

if(strcmp("VOLKAN","VOLKAN")==0) cout<<"okey"; else cout<<"no";

Çevrimdışı Klein

  • stm32
  • Profesyonel Üye
  • *
  • İleti: 3527
    • mikrosim
Ynt: C++ String İfade Karşlaştırması
« Yanıtla #1 : 05 Ağustos 2017, 00:07:11 »
Muhtemelen derleme esnasında baktı iki metin de aynı. O zaman neden bellekte iki kez oluşturayım dedi ve tek bir dizi oluşturdu.

Adreslerini yazdırıp bi bakın.

Çevrimdışı JKramer

  • Profesyonel Üye
  • *****
  • İleti: 1581
Ynt: C++ String İfade Karşlaştırması
« Yanıtla #2 : 05 Ağustos 2017, 00:26:45 »
Operator overloading'e bakın; <,>, ==, vs. kullandığınızda arka planda ilgili fonksiyonu çağırıyordur: http://en.cppreference.com/w/cpp/string/basic_string/operator_cmp

Çevrimdışı Klein

  • stm32
  • Profesyonel Üye
  • *
  • İleti: 3527
    • mikrosim
Ynt: C++ String İfade Karşlaştırması
« Yanıtla #3 : 05 Ağustos 2017, 00:33:19 »
Böyle bir karşılaştırmada "operator overloading" olduğunu düşünmüyorum.  "String" sınıfı gibi bir sınıfa ait bir nesnenin karşılaştırılmasında olabilir. Ama böyle ham dizide öyle bir şey yaparsa ciddi sıkıntı yaratır bence.

Çevrimdışı JKramer

  • Profesyonel Üye
  • *****
  • İleti: 1581
Ynt: C++ String İfade Karşlaştırması
« Yanıtla #4 : 05 Ağustos 2017, 00:48:45 »
Evet, haklısınız. Şimdi denedim, zaten uyarı veriyor:
Kod: [Seç]
warning: comparison with string literal results in unspecified behaviour [-Waddress]
Bunlar ("volkan") string literal olarak geçiyormuş.

Düzeltme: Forumda bir sorun var sanırım, kafasına göre font ve size ekliyor.

Ekleme:
https://stackoverflow.com/questions/29087406/comparison-with-string-literal-c
Alıntı
You can't compare two C-style strings by ==ing them. (C-style string literals just give you a pointer to the first character in a sequence of characters in RAM, ended by a 0 valued character, so you'd be comparing addresses instead of strings).

What you want to use would be the strcmp function from stdlib.

However, you're writing C++, not C.

So, I recommend using the string class, which has an overloaded == operator, so you can do

if (string1 == string2)
« Son Düzenleme: 05 Ağustos 2017, 00:51:50 Gönderen: JKramer »

Çevrimdışı volkanunal

  • Üye
  • **
  • İleti: 39
Ynt: C++ String İfade Karşlaştırması
« Yanıtla #5 : 05 Ağustos 2017, 01:28:09 »
Anladım çok teşekkür ederim , yani en doğrusu string sınıfına ait bir şey oluşturulmadıysa stcmp ile kontrol etmek gerekli diyebilir miyiz temiz olması açısından?

Çevrimdışı JKramer

  • Profesyonel Üye
  • *****
  • İleti: 1581
Ynt: C++ String İfade Karşlaştırması
« Yanıtla #6 : 05 Ağustos 2017, 01:39:02 »
Gerekliden ziyade zorunlu diyebiliriz. Uyarıda yazdığı gibi, sonuç "ok" de olabilir else bloğuna düşüp "no" da olabilir.

Çevrimdışı foseydon

  • Üye
  • **
  • İleti: 30
Ynt: C++ String İfade Karşlaştırması
« Yanıtla #7 : 05 Ağustos 2017, 02:14:11 »
Merhabalar , normal şartlarda derleyiciler her string için ayrı bir bellek oluşturup daha sonra bu bellekten çıktıyı veriyorlar diye biliyordum ve kıyaslarken farklı adreslerde gösterildiği için karşılaştırma yaparken else bloguna düşmesini bekliyordum ama "ok" çıktısını aldım , bu yanlış değil midir?

Şöyle bir deneme sonucu

if("volkan"=="volkan") cout<<"ok"; else cout<<"no";

Doğrusunun böyle olması gerekmez miydi?

if(strcmp("VOLKAN","VOLKAN")==0) cout<<"okey"; else cout<<"no";

Dediğin doğru, string tipi her değişken için ayrı hafıza alanı kullanır. Derleyicinin yaptığı işlem doğru, çünkü string değerlerini karşılaştırıyor adreslerini değil. Burada strcmp fonksiyonu senin düşündüğün gibi çalışmıyor yani. Şu şekilde çalışıyor, fonksiyona verdiğin string değişkenlerinin başlangıç adreslerine gidiyor ve bir loop ile "\0" görene kadar tek tek bütün karakterleri karşılaştırıyor, ona göre bir sonuç dönüyor.

bu arada "function overloading" yok.

Çevrimdışı mir_as82

  • Emektar
  • *****
  • İleti: 903
Ynt: C++ String İfade Karşlaştırması
« Yanıtla #8 : 05 Ağustos 2017, 05:59:23 »
Hocam burada ki konu tamamen dilin yapısını ilgilendiren bir konu aslında.
Karşılaştırma işlemlerinde iki çeşit karşılaştırma vardır.


1-Shallow compare-sığ
   Adres karşılaştırma(referans)
2-Deep compare-derin
    Adresin gösterdiği yerdeki verileri karşılaştırma.


Çevrimdışı yamak

  • Profesyonel Üye
  • *****
  • İleti: 1899
Ynt: C++ String İfade Karşlaştırması
« Yanıtla #9 : 05 Ağustos 2017, 12:42:26 »
C/C++ da literal stringler memory de bir bölgeye yazılır ve işlemler adres üzerinden yapılır. Bu örnekte derleyici aynı iki string karşılaştırıldığı için bu işlemi bile yapmayıp
o if bloğunda sadece cout <<"ok" satırını derleme işlemine tabi tuttu. O stringlerin adreslerini bi pointer a atıp karşılaştırma işlemini pointerlar üzerinden yaparsanız else kısmı çalışır