C dili kısayol atamaları

Bu konuyu okuyanlar

NeverTellLie

Öğrenci
Katılım
14 Nisan 2017
Mesajlar
56
Reaksiyon puanı
2
Puanları
8
Yaş
28
a = 5; // a = 5
b = a++; // a = 6 ve b = 5
c = ++a; // a = 7 ve c = 7

Yukarıdaki kodda 2. satırda b neden a'nın 1 fazlası değil de direk a'nın değerini aldı 3. satırda ++'yı sola kaydırınca neden c ile a artmasına rağmen 2. satırda b artmadı açıklarsanız çok sevinirim:):D
 

mirinkirin

Doçent
Katılım
4 Temmuz 2016
Mesajlar
708
Reaksiyon puanı
358
Puanları
63
Cde kodları okurken yukarıdan aşağıya ve soldan sağa okuyun, istisnalar dışında bu sizi doğru çözüme götürür.
b = a++; (b=a olur sonra a 1 artar)
b = ++a; (b=a olmaz, önce ++ operatörünü görüyor onun işinin bitmesi gerekli, a 1 artar sonra b=a olur)
 

sonerooz

Doçent
Katılım
25 Mart 2017
Mesajlar
555
Reaksiyon puanı
216
Puanları
43
Yaş
29
Dillerin compile edilme sırası değişebilir. Fakat bilindik diller (java ve c ailesi) soldan sağa okunur.

O zaman instructionları açarak anlatmaya çalışayım

a = 5; // a = 5
//b = a++;
b=a; //b=5
a=a+1; //a=6

//c = ++a;
a=a+1;// a = 7
c=a; //c = 7

En karmaşık halini sorayım
x=10;
x+=--x;

Bunu açarsak
x=x+(--x);
x=10+9;
x=19;

Ama bunlar readability'i düşürdüğü için kullanılmaz ancak, bir mülakat sınavında ya da Lisans eğitmizde PL(Programming Languages) Dersinde karşınıza çıkar.
 
Son düzenleme:

arsenik

Müdavim
Katılım
8 Ağustos 2009
Mesajlar
11,365
Reaksiyon puanı
242
Puanları
63
Atama operatörlerinde sağdaki değişken soldakine atandığı için burada soldan sağa doğru okuyun demek bence biraz kafa karıştırıcı olur.

Arttırma operatöründe a++ ise önce atama sonra a değişkeninin değerini arttırma mantığıyla bana daha kolay geliyor. Yeni başlayan biri için kodlar soldan sağa doğru okunur demek bilemiyorum biraz kafa karıştırıcı olabilir. Sonra atama operatöründe hani soldan sağa okuyorduk niye a = b için a yı b ye atmıyoruz gibi sorunlar doğurabilir.
 

sonerooz

Doçent
Katılım
25 Mart 2017
Mesajlar
555
Reaksiyon puanı
216
Puanları
43
Yaş
29
fakat bunun terminolojideki karşılığı budur. = operatorunun önündeki işlemleri zaten saymıyorum... O algoritma 1'de ilk konu olarak veriliyor :)
 

mirinkirin

Doçent
Katılım
4 Temmuz 2016
Mesajlar
708
Reaksiyon puanı
358
Puanları
63
Atama operatörlerinde sağdaki değişken soldakine atandığı için burada soldan sağa doğru okuyun demek bence biraz kafa karıştırıcı olur.

Arttırma operatöründe a++ ise önce atama sonra a değişkeninin değerini arttırma mantığıyla bana daha kolay geliyor. Yeni başlayan biri için kodlar soldan sağa doğru okunur demek bilemiyorum biraz kafa karıştırıcı olabilir. Sonra atama operatöründe hani soldan sağa okuyorduk niye a = b için a yı b ye atmıyoruz gibi sorunlar doğurabilir.
Haklısınız sadece soldan sağa okunur deyince kafa karıştırabilir o zaman ekleme yapalım.
b = ++a ifadesinde ilk görülen b ve b'nin değeri bir şeye eşit olacakmış, o zaman önce neye eşit olacağını bulmamız gerekli, bu yüzden önce eşitliğin sağındaki işlem bitecek sonra atama yapılacak.
 

Ben Kenobi

Müdavim
Katılım
6 Kasım 2011
Mesajlar
7,336
Reaksiyon puanı
3,155
Puanları
113
bu temel bir konu
c++ demek; c'nin şu anki değerini kullan ama sonraki koda geçmeden hemen önce bir arttır demektir.
++c demek; c'nin değerini arttır ve bunu şu an kullan demektir.

bunların temel amacı özellikle yoğun matematiksel formül içeren kodları yazarken kısaltmayı sağlamak.

örnek 1
c = a;
a = a + 1;
yerine
c = a++;
yazabilirsin.

örnek 2
c = a + 1;
a = a + 1;
yerine
c = ++a;
yazabilirsin.

ayrıca bu kodlar elektronik sistemde doğrudan ifade edilebiliği için üstteki iki satırlık örneğe göre daha hızlı çalışır. (milyonda bir oranında)
bu oran küçük gibi gelebilir ama misal resim işleme programında full hd resim için 1920x1080 pixel rgba 4 kanal varsayarsak 8 milyona yakın pixelin işlenmesi söz konusu olduğunda hatta video işleme programında bunların saniye 30 kez işlenmesi yani 240 milyon işlem söz konusu olduğunda belirgin hız artışı sağlayabilir.

ayrıca bir not, ++c kodu c++ koduna göre on milyonda bir daha hızlıdıdr, o yüzden for döngülerinin sonuna alışkanlık olarak yazılan i++ yerine ++i kullanmaya çalışın.
 

mirinkirin

Doçent
Katılım
4 Temmuz 2016
Mesajlar
708
Reaksiyon puanı
358
Puanları
63
@Ben Kenobi hocam ++c ile c++ kodunun assembly dökümü aynıdır aralarında trilyon da bir olsa da fark olmaz.
 

sonerooz

Doçent
Katılım
25 Mart 2017
Mesajlar
555
Reaksiyon puanı
216
Puanları
43
Yaş
29
ayrıca bir not, ++c kodu c++ koduna göre on milyonda bir daha hızlıdıdr, o yüzden for döngülerinin sonuna alışkanlık olarak yazılan i++ yerine ++i kullanmaya çalışın.
bu bilgiyi ilk defa duyuyorum. Eğer böyle ise kısa yollar kendi içerisinde niye i++ olarak geliyor acaba? elle for yazmayali çok uzun zaman oldu...
--- Gönderi Güncellendi ---
@Ben Kenobi hocam ++c ile c++ kodunun assembly dökümü aynıdır aralarında trilyon da bir olsa da fark olmaz.
bana da öyle geliyor. Assemblyleri aynıdır. Bir atama yok sonuçta...

INC c tek satırda işliyor.
 

Ben Kenobi

Müdavim
Katılım
6 Kasım 2011
Mesajlar
7,336
Reaksiyon puanı
3,155
Puanları
113
@Ben Kenobi hocam ++c ile c++ kodunun assembly dökümü aynıdır aralarında trilyon da bir olsa da fark olmaz.
Is there a performance difference between i++ and ++i in C?
Stackoverflow'da bu konuda sorulmuş sorular var.
Assembly kodları aynı değil çünkü c++'da cisme ait bir kopyanın oluşturulması gerekiyor.
Bu kopya bazı int tiplerinde zaten memory map içerisinde olma ihtimali bulunuyor, eğer öyleyse compiler bunu optimize ederek farkı sıfırlıyor.
Lakin nedense ben bu tarz çook ince optimizasyonların MSVC compilerında yapılmadığına %100 eminim, GCC ve onun Windows portu MingW veya clang'ta yapıldığına ise eminim.
Ancak bu kopya özellikle daha karmaşık class tiplerinde memory map içerisinde bulunmuyor çünkü sadece adresi bulunuyor, işte o zaman fark kesin olarak açığa çıkıyor.

More Effective C++ kitabında da belirtildiği üzere prefixler her zaman postfixlere göre tercih edilmelidir tabi eğer mümkünse.

İşte örnek assembly
c++ 5 instruction
Kod:
a = ++b + c;

; increment b
LD    A, [&b]
INC   A
ST    A, [&b]

; add with c
ADD   A, [&c]

; store in a
ST    A, [&a]
++c 6 instruction
Kod:
a = b++ + c;

; load b
LD    A, [&b]

; add with c
ADD   A, [&c]

; store in a
ST    A, [&a]

; increment b
LD    A, [&b]
INC   A
ST    A, [&b]

Bu tarz ince bilgileri üniversite hocalarından duymazsınız, reyisiniz Ben Kenobi'den ancak duyarsınız. :D
Zaten liyakat uygulansaydı ben de en kötü ihtimalle bir yerde hoca olurdum.
 

mirinkirin

Doçent
Katılım
4 Temmuz 2016
Mesajlar
708
Reaksiyon puanı
358
Puanları
63
@Ben Kenobi, attığınız kodlar atamaya dair kodlar. a=++b ve a=b++ nın assembly kodlarının aynı olmasını bekleyemeyiz, beklesek ikisinin sonucu da aynı çıkardı zaten. Benim bahsettiğim doğrudan i++; ve ++i; karşılaştırmasıydı. Aynı şekilde döngü içinde i++ veya ++i dediğimizde arada bir fark olmaz.
İyi üniversitelerde Bryant & O'Hallaron Computer Systems kitabı işlenir, önceden öyleydi yani sanırım hala da öyledir. Bazı yerlerde Sebesta'nın Programming Languages kitabı da okutuluyor, Türkiye'de var mı okutan üniversite bilmiyorum. Hemen havalara girmeyin yani:)
--- Gönderi Güncellendi ---
Forum dediğin böyle olmalı işte, özlüyoruz şöyle konuları şöyle tartışmaları.
 

Ben Kenobi

Müdavim
Katılım
6 Kasım 2011
Mesajlar
7,336
Reaksiyon puanı
3,155
Puanları
113
@Ben Kenobi, attığınız kodlar atamaya dair kodlar. a=++b ve a=b++ nın assembly kodlarının aynı olmasını bekleyemeyiz, beklesek ikisinin sonucu da aynı çıkardı zaten. Benim bahsettiğim doğrudan i++; ve ++i; karşılaştırmasıydı. Aynı şekilde döngü içinde i++ veya ++i dediğimizde arada bir fark olmaz.
İyi üniversitelerde Bryant & O'Hallaron Computer Systems kitabı işlenir, önceden öyleydi yani sanırım hala da öyledir. Bazı yerlerde Sebesta'nın Programming Languages kitabı da okutuluyor, Türkiye'de var mı okutan üniversite bilmiyorum. Hemen havalara girmeyin yani:)
--- Gönderi Güncellendi ---
Forum dediğin böyle olmalı işte, özlüyoruz şöyle konuları şöyle tartışmaları.
Yahu bırak da iki havaya gireyim. :D
i++ ve ++i kısmını zaten açıkladım, msvc compilerına güvenmiyorum diye.
 

NeverTellLie

Öğrenci
Katılım
14 Nisan 2017
Mesajlar
56
Reaksiyon puanı
2
Puanları
8
Yaş
28
@NeverTellLie ortalığı karıştırdın bak :D

@Ben Kenobi senin attığın şu linkte aratacağım :) Belki bir ufuk, bir detay görürüz :) Teşekkürler.
Biraz karıştırdım sanki:):) Yeni katıldığım bu forumda bu kadar ilgi alaka beklemiyordum açıkçası çok teşekkürler hepiniz çok detaylı anlatmışsınız:D
 
Üst