ÜYE GİRİŞİ  
Kullanıcı adı :
Parola :
 
  Üye Ol!  
 
 
ANASAYFA HABERLER ASP ASP.NET PHP C/C++ C# JAVA ARAMA İLETİŞİM

ASP.NET
  Expression Web ile Site Yapimi
  Web Server Control Yazmak - 2
  Web Server Control Yazmak - 1
  Sql Cache Dependency
  Web Kontrollerini Etkin Kullanmak
  Xslt Kullanımı
  Bir Web Sayfasının Anatomisi
  Client Script Callback
  Login Kontrollerinin Kullanımı

ASP
  ASP Nesneleri
  29 Soruda ASP
  Matematiksel Uygulamalar
  Select Case Yapısı 2
  Fonksiyon(Function) Kullanımı
  IF-ELSE...
  GET Yöntemi ile İşlemler
  Asp de Tarih ve Saat fonksiyonları
  While-wend döngüsü

C Sharp (C#)
  C#'da klasör işlemleri
  C# ile diziyi tersine çevirme
  Çok Kullanılan Kontroller-1
  C# ile Kronometre Uygulaması
  Overloaded Metotların Gücü
  C# ile XMLQuery Örneği
  Rastgele Kod Üretimi
  Kontroller ile Çalışma
  Düzenli İfadeler Nedir?

DUYURULAR

F# Microsoft dil teknolojisinin en yeni üyesi.Common Lisp-Slime-Emacs tarzında etkileşimli,kıvrak,sonuçların anında görülebildiği ve yüksek performanslı bir betik dil olarak özetleyebiliriz bu yeni dili. devamı >>


Türk Telekom'dan yapılan yazılı açıklamada, Telekomünikasyon Kurumu'nun onayladığı yeni tariflerin, internet servis sağlayıcı şirketlerin maliyetlerini önemli oranlarda düşüreceği aktarıldı. devamı >>


Değerlendirme Sırası | Asundinay.Com
C/C++ İçin Eklenmiş Makale
 Makale Adı  :  Değerlendirme Sırası
 Yayın Tarihi :  12.08.2007 21:05:10 Ekleyen :  Kazım Aydın Okunma : 313

Asıl konuya girmeden önce birascık fonksiyon argümanlarının değerlendirilme sırasından bahsedeceğiz.

#include
using namespace std;

int topla(int a, int b)
{
return a + b;
}

int main()
{
int i = 7;
cout << topla(i, i *= 3) << endl;
i = 7;
cout << topla(i *= 3, i) << endl;
return 0;
}



Bu kodun çıktısının 28 ve 42 olacağını mı düşünüyorsunuz. Belki doğru düşünüyorsunuz belki de yanlış. Ama eğer ki fonksiyon argümanlarının standart bir şekilde gerekli parametrelere aktarıldığını düşünüyorsanız, c++ standart ları size bunun doğru olmadığını söyleyecektir. Bu derleyiciden derleyiciye değişen bir durum. VC++ 7 de bunun sonucu 42 ve 42. Başka bir derleyici de başka bir sonuç ta olabilir.

Benzer durum deyimlerde de görülüyor :

#include
using namespace std;

int a()
{
cout << "a cagrildi" << endl;
return 2;
}

int b()
{
cout << "b cagrildi" << endl;
return 3;
}

int c()
{
cout << "c cagrildi" << endl;
return 4;
}

int main()
{
int i = a() * (b() + c());
cout << i;

return 0;
}



Yukarıdaki kodda; önce parantez içindeki işlem yapılıp, dönen sonuç a() fonksiyonundan dönen sonuçla çarpılacak ve en son dönen değer i ye atanacak (Öncelik sırasını hepimiz biliyoruz değil mi). Ama buradaki sorun önce hangi aritmetik operatörün iş göreceği değil, önce hangi fonksiyonun değer döndüreceğidir. İşte bu durum da derleyiciden derleyiciye değişir (burada 6 durum söz konusu). Eğer herhangi bir fonksiyonun önce çağrılması sizin için önemliyse :

int aSabitle = a();
int i = aSabitle * (b() + c());



Neyse ki yukarıdaki kodda a() nın en önce çağrılacağını garantiledik.

Aslında fonksiyonların çağrılma sırasını sabitlemenin değişik durumlarda değişik yolları var. Bunlardan “kısa-devre” özelliği olan mantıksal operatörler (olmayanı var mı? Aklınızda tutun, bu kadar zohbetin ortaya çıkma zebebi belki de buydu.) ve virgül operatörü şimdilik aklıma gelenleri.

int a();
int b();
a() && b();


Önce a() fonksiyonun çağrılacağını biliyoruz. b() fonksiyonu ise duruma göre çağrılabilir de çağrılmayabilir de (kısa-devre olayı). Aşağıdaki kod da virgül operatörünün kullanımını örnekler.

int a();
int b();
int c();
iint d()
{
// ...
return a(), b(), c();
}



Eğer böyle kod yazıyorsanız durumunuz vahim. Çıkıp biras hava alın, zinemaya gidin, ne bileyim müsik falan dinneyin. Çünkü arkadaşlarınız arasında asosyal olarak bilinen kişi sizsiniz. Daha trediyşınıl (geleneksel) kullanım şöyle olabilir :


int d()
{
a();
b();
//..
return c();
}



Şimdi bütün bu bilgileri aklımızın kenarına yazıp devam edelim…

-&& ve || operatörlerini aşırı yükleme

Aşırı yüklediğimiz && ve || operatörü standart olanları kadar kullanışlı değildir. Bunun nedenlerine kod üzerinde bir bakalım.

class MyClass
{
public :
MyClass(int i=0, string ismim = "ismim yok") : i_(i), ismim_(ismim) {}
MyClass operator()() const;
friend bool operator && (const MyClass &, const MyClass &);
protected :
int i_;
string ismim_;
};

MyClass MyClass::operator()() const
{
cout << ismim_ << endl;
return *this;
}

bool operator && (const MyClass & mc1, const MyClass & mc2)
{
return mc1.i_ && mc2.i_;
}

int main()
{
MyClass m1(0, "birinci");
MyClass m2(3, "ikinci");

if (m1() && m2())
{
cout << "if in icindeyim" << endl;
}
return 0;
}



Yukarıdaki kodu biraz açıklayacak olursak :

MyClass içinde operator() aşırı yüklememdeki amaç; geçerli nesneyi, operator&&() fonksiyonuna argüman olarak aktarılan fonksiyon havası katmaktı (DİKKAT !!!). Bu operator()() fonksiyonunun yaptığı iş; ait olduğu nesnenin ismini ekrana basmak ve aynı nesneyi değer olarak döndürmekten ibaret.

Şimdi de operator&&() fonksiyonuna göz atalım. Bu fonksiyon kendisine argüman olarak aktarılan iki MyClass tipinde verinin i_ üyeleri arasında standart && (ve) işlemini gerçekleştirir ve bool bir değer döndürür.

Bu kodun çıktısı şaşırmayacağınız üzere aşağıdaki gibidir:

ikinci
birinci



Eeee nerde “kısa-devre”. Eğer aldığınız sonucun hala bu olduğuna anlam veremiyorsanız, yukarıdaki paragrafları tekrar gözden geçirmenizi salık veririm (Bismillahirrahmanirrahim, bu kelime burada çok karizma oldu. Salık veririm diyince Hakkı Öcal ı hatırladım).

Zanırım operator&&() ün bir fonksiyon olduğunu yukarıda birçok kes tekrar ettim. Bu bir fonksiyon olduğundan ve fonksiyon bloğu işleme konulmadan önce tüm argümanların ilgili parametrelere aktarılacağından “kısa-devre” imkansız gibi görünüyor. Aslında if içine yazdığımız ifade operator&&(mc1(), mc2()) ile aynı (isteyen onun yerine bunu yazarak deneyip, sonucun aynı olduğunu görebilir).

Peki diyelim ki ben rahatsız, psikopat bi adamım.. illa da kendi tiplerim üzerinde && ve || operatörünü kullanarak kısa-devre olayını gerçekleştirmek istiyorum. Aşırı yüklemeyle değilde, belki zorumusun yanıtını kınvörşın (dönüşüm) operatörünü kullanarak bulabiliriz.


class MyClass
{
public :
MyClass(int i=0, string ismim = "ismim yok") : i_(i), ismim_(ismim) {}
operator bool() const
{
cout << ismim_ << endl;
return i_ != 0;
}

protected :
int i_;
string ismim_;
};

int main()
{
MyClass m1(0, "birinci");
MyClass m2(3, "ikinci");

if (m1 && m2)
{
cout << "if in icindeyim" << endl;
}
return 0;
}



işte bu kod beklediğimiz sonucu veriyor :

birinci



Artık nesnenin ismim_ üyesini ekrana basan bir fonksiyona ihtiyacımız olmadığı için operator()() fonksiyonunu kaldırdım. Ekrana basma işlemini dönüşüm operatörü içinde hallettim.


 

Kaynak : ceturk.com


 

C/C++ İçin Eklenmiş Tüm Makaleler
C/C++ İçin En Son Eklenen 5 Makale
 Makale Adı  :  C ögreniyorum -8-
 Yayın Tarihi :  16.10.2008 17:20:17 Ekleyen :  özen karaçakır Makaleyi Oku  
 Makale Adı  :  C ögreniyorum -7-
 Yayın Tarihi :  22.06.2008 15:48:18 Ekleyen :  özen karaçakır Makaleyi Oku  
 Makale Adı  :  C ögreniyorum -6-
 Yayın Tarihi :  20.06.2008 18:15:06 Ekleyen :  özen karaçakır Makaleyi Oku  
 Makale Adı  :  C ögreniyorum -5-
 Yayın Tarihi :  26.10.2007 10:24:15 Ekleyen :  özen karaçakır Makaleyi Oku  
 Makale Adı  :  C ögreniyorum -4-
 Yayın Tarihi :  13.09.2007 23:36:40 Ekleyen :  özen Karaçakır Makaleyi Oku  

C/C++
  C ögreniyorum -8-
  C ögreniyorum -7-
  C ögreniyorum -6-
  C ögreniyorum -5-
  C ögreniyorum -4-
  C ögreniyorum -3-
  C ögreniyorum -2-
  C ögreniyorum -1-
  İlk C++ Programımız

JAVA
  Java ile Histogram Eşitleme
  JAVA İçinde Thread Kullanımı
  Serialization İşlemleri 2
  Serialization İşlemleri
  İlk Bakışta JSP
  Servletler ile Web Sayfaları
  Java ile Grafik Çizim
  Java, MySql Bağlantısı
  JBuilder ile Database

PHP
  php dersleri -1-
  php/access ile silme işlemi
  php ile access'e bağlanma - 2
  php ile access'e bağlanma - 1
  Döngü ve Diziler - BÖLÜM 5
  Döngü ve Diziler - BÖLÜM 4
  Döngü ve Diziler - BÖLÜM 3
  Döngü ve Diziler - BÖLÜM 2
  Döngü ve Diziler - BÖLÜM 1

İSTATİSTİKLER
  Toplam ziyaret :  24684
  Toplam üye sayısı :  1077
  Asp makale sayısı :  20
  Asp.Net makale sayısı :  54
  Php makale sayısı :  26
  C/C++ makale sayısı :  51
  C# makale sayısı :  29
  Java makale sayısı :  33
  Toplam makale saıysı :  213
Copyright asundinay® 2007 Her Hakki Saklidir
Tasarim & Programlama asundinay®