Merhaba, hoş geldiniz.
Bu derste, operatör olduklarını düşünmek zorunda olmadığınız, biraz garip olan
birkaç operatörden bahsetmek istiyorum.
Çünkü bu noktaya kadar öğrendiğimiz tüm operatörler aslında sadece sayılar üzerinde hesaplamalar
yapmak için sembol kullanmayı işaret ediyor.
Ve bu operatörler aslında fonksiyonlara benziyor.
Şimdi sizeof işlecindeki döküm hakkında konuşalım.
Öncelikle cast operatöründen bahsetmek için, size biraz tür
dönüşümlerinden, verilerin nasıl dönüştürüldüğünden bahsetmem gerekiyor.
Veri türleri ve farklı veri türleri hakkında her şeyi öğrendik.
Ancak verileri farklı türlere atamaya çalışıyorsanız, c programlama
dilinde devam eden bazı örtük dönüşümler vardır.
Bu nedenle, verilerin farklı türler arasında dönüştürülmesi otomatik olarak gerçekleşebilir
ve bu, dil tarafından örtük olarak veya program tarafından
program tarafından açıkça dönüştürme olarak adlandırılır.
Programcının kendisi, geliştirici bir şeyler yapabilir.
Esasen bir dönüştürme yapmak için bir döküm operatörü kullanabilirler.
Örtük olarak dönüştürülen veriler gerçekten önemlidir
çünkü bunu anlamanız gerekir çünkü etkili bir şekilde geliştirmek
için geliştireceğiniz çoğu c programı, bu dönüşümler için bu kuralları
anlamanız gerekir.
Çünkü genellikle tam sayılar ve kayan noktalı sayılar, ondalık
sayılar ve tam sayılar olacaktır.
Ve bunları bazen birbirine karıştırarak kullanacaksınız.
Ve bunu yaptığınızda, işlerin nasıl dönüştürüldüğünü bilmeniz gerekir.
Şimdi cast operatörünü kullanarak bundan olabildiğince kaçınmaya çalışmalısınız.
Ancak döküm operatörünü kullanmadığınızda, neler olup bittiğini anlayın.
Burada farklı float ve double tiplerine veri
atadığınızda, veri ya kesilecek
ya da yükseltilecektir.
Bunlar duyacağınız iki terim.
Kırpılmış, daha az hassas hale geldiği ve yükseltilmiş,
daha hassas hale geldiği anlamına gelir.
Bu yüzden bu türleri karıştırmamaya çalışın ancak faydalı olabilirler.
Anlaşılması gereken en önemli şey, daha önceki derslerden c'nin çok esnek olduğunu bilmemizdir.
Ve bu, dili tasarlayanların bilinçli bir kararıdır.
Esnek olmasını istediklerinde, ancak yine bir değiş tokuş olarak, bu ek özgürlük
size verildiğinde, bunu kötüye kullanabilirsiniz.
Bu
yüzden türleri karıştırma fikrini kötüye kullanmayın.
Mümkün olduğunca aynı türleri kullanmaya çalışın; tamsayılar tamsayılarla, kayan sayılar kayan sayılarla.
Ancak bunu yapamadığınızda,
ya örtük dönüşümleri anlayın ya da cast operatörünü kullanarak
açık dönüşümleri yapın.
Yani yine başka bir konu ya da c'nin
esnek olduğu başka bir kavram, ancak bunu kötüye kullanmamalısınız.
Dolayısıyla, c'de bir tamsayı değişkenine kayan noktalı
bir değer atandığında, int x, float y,
x eşittir y olur.
Sayının ondalık kısmı kesilecektir.
Yani bir int x sayınız varsa 0'a eşittir, float f ise
12'ye eşittir. 125 ve f'yi x'e atarsanız,
x'in değeri 12 olacaktır.
Bu hassasiyeti kaybedeceksin. Bir int değerine float atadığınız
için değer kesilecektir. Bir int yalnızca bir tam sayının nasıl saklanacağını bilir.
Yani programlama dili tarafından, derleyici tarafından otomatik olarak 12'ye dönüştürülüyor.
Yalnızca ithalat depolanacaktır.
Şimdi bir tamsayı değişkenini kayan noktalı bir değişkene atarsanız, ki bu tam tersidir, sayının
değerinde herhangi bir değişikliğe neden olmaz.
Değer sistem tarafından dönüştürülür ve kayan değişkende saklanır.
Böylece bir akışa atama konusunda gerçekten endişelenmenize gerek kalmaz.
Bir akışa 12 atarsanız, yine de 12 olacaktır, sadece 12. 0.
Tamsayılar üzerinde aritmetik işlem gerçekleştirdiğinizde,
bu sadece değerleri bir float'a veya float'ı int'e atamaktan farklıdır, bu bir ifadeniz
olduğunda, durum ne olursa olsun, biraz
toplama, biraz çıkarma yaparsınız.
Bir çıkarma veya toplama işlemi yaparken, iki işleneniniz vardır.
Ve böylece bir operatör int, bir operand float olabilir.
Hangi dönüşümün nasıl gerçekleştiğini bilmeniz gerekir.
Dolayısıyla, bir ifadede iki işleneniniz varsa ve bunların her ikisi
de tamsayı ise bölme işleminden kaynaklanan ondalık kısımlar atılır.
Yani eğer elinizde bir x tamsayısı varsa, bu 20'dir.
Elinizde bir y tamsayısı var, 12. Ve 20'yi 12'ye bölüyorsun.
Bir puan falan filan alamayacaksınız. Sadece bir tane alacaksın.
Tüm sonuçları atacak ve yeni bir sonuç koyacaktır çünkü yine bir int yalnızca bir tam sayıyı saklar.
Yani iki sayı ints ve bölme işlemi yapıyorlar.
Kayan noktalı bir sayı elde edemezsiniz. Ondalıklı bir sayı almayacaksınız.
Şimdi eğer bir operatör int ve diğeri float ise, o zaman işlem kayan nokta
işlemi olarak oluşturulacaktır. Yani eğer float f değeriniz 20 ise. 0, float a 10, bir int,
sonra orada bir bölme işlemi yaparsanız
veya 12, üzgünüm bu daha uygun olurdu, o zaman sonuç
bir kayan nokta sayısı yapacak ve sonuç
1 nokta 8888 veya durum ne olursa olsun 1 nokta olacaktır.
Bu verileri herhangi bir şeye atamıyorsunuz. Bu, geri dönüşün ne olacağının bir ifadesidir.
Yani bir bölümde iki vuruş, tam sayı olacak.
Bir int ve double veya float, her zaman bir float olacaktır, her zaman ondalık ondalık
kayan nokta işlemi olacaktır.
Bu da örtük dönüşümdür. Hiçbir şey yapmazsanız program tarafından sizin için
neler yapıldığını ve neler olduğunu anlamak için gerçekten ihtiyacınız olan şey budur.
Ancak, cast operatörü ile yapabileceğiniz
bazı açık dönüşümler yapmayı denemelisiniz.
Bu da aşağı yukarı döküm olarak adlandırılır.
Ve dönüştürmek istediğinizde birçok dilde döküm görüyorsunuz.
Ve tüm yaptığınız açık bir dönüşümdür, verinin
ne olmasını istediğinizi söylüyorsunuz.
Eğer yapabiliyorsanız bunu yapmak istersiniz çünkü aksi
takdirde verilerin değeri düşebilir, kaybolabilir.
Eğer iki inç yapıyorsanız ve bölme işlemi yapıyorsanız ve bunlar
eşit olarak bölünmüyorsa, tüm bu verileri kaybedersiniz.
Bu nedenle, istediğiniz tür dönüşümünü açıkça belirterek
talep etmeniz mümkündür.
Buna döküm denir ve nicelikten önce parantez içinde
istenen türün adının gelmesinden oluşur.
Yani parantezler
ve tür adı cap operatörünü oluşturur.
Bir sol parantez yaparsınız ve ardından veri türünü belirtirsiniz ve ardından parantez yazarsınız.
Ve bu, sağında ne varsa, sağındaki ifade ne
olursa olsun veya tek bir değişken olsa bile, bunu parantezlerin
içinde ne varsa ona dönüştürecektir.
Bu nedenle, uzun gibi gerçek bir tür istendiğinde, bu sözcük türü ile değiştirilir.
Dolayısıyla, tip geçti operatörü, üniter eksi ve üniter artı hariç tüm aritmetik operatörlerden daha
yüksek bir önceliğe sahiptir. Henüz önceliği öğrenmedik.
Bir sonraki derste bunu yapacağız. Öncelik temelde ne olduğudur,
gerçekleştirilen işlemlerin sırasıdır.
Bu yüzden bu konuda bazı örnekler vereceğiz. Bu noktada anlamanız gereken tek şey, typecast
işlecinin iki tek eksi ve tek artı hariç diğer tüm işleçlerden öncelikli olduğudur.
Örneğin burada 21 numaramız var. 51 ve cast operatörümüz var çünkü
bunun cast operatörü olduğunu biliyoruz çünkü parantez
içinde ve bir türü var. Ve temelde söylediğimiz
şey 21'i al. 51 int değerine dönüştürün.
Buna dönüştürülmüş bir kayan nokta sayısı
alırsanız, sadece int, tam sayı, 21 olur.
Aynı şeyi sağ tarafta da yapıyor, 26'ya dönüştürüyor. 99 bir int.
Bu ifadeyi bir deyim içinde kullansaydınız aslında burada ne olurdu, 21 artı
26 olarak değerlendirilirdi. Verileri 0'dan itibaren
kesecektir. 51 tam sayıya eşittir ve 0 ile aynıdır. 99.
Ve işte bu, bir veri türü içeren parantez içindeki herhangi bir şey olan döküm operatörüdür.
Bunu çok sık göreceksiniz.
Eğer 21 artı 26 derseniz ve bunu kayan noktalara atarsanız, sadece bir
nokta 0 ekleyecektir.
Genellikle, daha hassas bir tipe döküm yapmazsınız çünkü daha hassas
olamayacaksınızdır.
Daha kesin bir türden daha az kesin bir türe geçersiniz.
Yani daha çok bir float'ı int'e çevirmek gibi.
Bu nedenle, farklı türleri kullanırken bunu bazı programlarda
zaman zaman göreceksiniz. Aritmetik işlem yapıyorsanız farklı türler
kullanmaktan kaçınmalısınız. Ama yaparsanız, bunu göreceksiniz.
Operatörün boyutu, diğer operatörlerin çoğuna benzemeyen,
biraz garip bir operatör. Ve bu aslında bir fonksiyona benziyor.
Ancak sizeof bir işleçtir. Bir eylem gerçekleştirir.
İşlev odaklı bir şey yapmıyor.
Yaptığı şey, size belirli bir tür tarafından bellekte kaç bayt işgal
edildiğini söylemektir. Yani bir argüman aldığı için bir fonksiyon gibi görünür.
Ve buna bir örnek vereceğiz ancak sadece bellekteki bayt sayısını döndürecektir. Çalıştırdığınız sisteme, çalıştırdığınız
platforma, işletim sistemine, bilgisayarın
mimarisine, donanıma bağlı olarak, farklı veri türlerinin farklı
boyutlarda bellekte temsil edileceğini unutmayın.
Örneğin, bir int 1 sistemde 4 bayt, diğerinde 8 bayt olabilir.
Yani yapabileceğiniz şey, sizeof operatörünü c'de özel bir anahtar kelime olarak kullanabilir ve bir
veri tipi girebilirsiniz ve size bellekte kaç bayt kullandığını söyleyecektir.
Yani sizeof aslında bir operatördür, bir fonksiyon değildir.
Argümanında değişken uzunlukta bir dizi kullanılmadığı sürece çalışma zamanında değil derleme zamanında değerlendirilir.
Bu yüzden bundan bahsedeceğiz. Bu temel olarak, bir dizinin boyutu içinde
bir değişkeniniz varsa, çalışma zamanında
derleme zamanında çözülmeyeceğini, bu nedenle bilmenin o kadar önemli olmadığını
söylüyor.
sizeof işlecinin argümanı bir değişken, bir dizi adı,
int float gibi temel bir veri türünün adı, türetilmiş
bir veri türünün adı veya bir ifade olabilir.
Yani sizeof x artı y diyebilirsiniz.
Ve bu temelde sadece x'in boyutu artı y'nin boyutu
veya ortaya çıkan sayıları söyleyecektir. Eğer x bir int, y bir int ve sizeof 16 ise, bunun bir inç
4 bayt olduğunu söyleyecektir.
Biri int biri float olsaydı ve sonuç kayan nokta aritmetiği olsaydı, o
zaman float 8 bayt veya başka bir şey olurdu.
Ancak bunu birçok şey için kullanabilirsiniz ve birçok şey için kullanmalısınız. Örneğin sizeof int, int türündeki
bir değişkenin kapladığı bayt sayısını verir.
Yani bu, sisteminize bağlı olarak 4 veya 8 döndürür.
Sizeof işlecini bir ifadeye de uygulayabilirsiniz, belirttiğim
gibi sonuç değerin boyutudur.
Bu, alan ifadesinden kaynaklanır. Yani iki int bir araya gelirse, yine de bir int olacaktır.
Yani hala bir beden olacak. Ancak sizeof operatörünün işaretçilerden bahsederken de kullanıldığını göreceksiniz.
Bu konu hakkında şimdi konuşmak istedim çünkü bu bir operatör.
Ancak daha fazla kavramdan bahsederken sınıf boyunca bu ve dökümle ilgili
daha birçok örnek vereceğiz.
Özellikle, sizeof operatörü işaretçilerden bahsederken
çok daha fazla devreye girer çünkü işaretçilerin
ne kadar bellek ayıracağını hesaplarken sizeof kullanırsınız çünkü kesin
olmak istersiniz.
Ancak bunu başka şeyler için de kullanabilirsiniz.
Bu nedenle, programınızda sabit kod boyutlarını hesaplamaktan kaçınmak için mümkün olduğunca sizeof
operatörünü kullanın.
Sabit kod boyutları sihirli sayılar iyi bir şey değildir çünkü yine farklı bir
sistemdeyseniz, bir sistemde bir int için 4 kodunu sabit kodlarsanız,
diğer sistemde 8 olabilir, bu nedenle sizeof'u olabildiğince çok kullanın ve
işaretçiler hakkında konuştuğumuzda bunun çok daha fazla ilişkilendirilebilir
olduğunu göreceğiz.
Biraz garip olan diğer operatörler
yıldız işareti operatörüdür.
Kendi kendinize yıldız işareti, bunu zaten çarpma işleminde konuşmuştuk demiş olabilirsiniz.
Ancak bu yıldız işareti, biri solda diğeri sağda olmak üzere iki işlenen alır.
Yıldız operatörünü bir değişkene uygularsanız
ve sadece yıldız değişken adını sağa doğru tek bir argümanla söylerseniz, bu
başka bir şeyi temsil eder. Aslında bir işaretçiyi temsil eder.
Bir işaretçiyi dereferencing ediyor.
Ve yine, şimdi bunun üzerinde durmayacağım çünkü işaretçiler hakkında konuşurken
bunun üzerinden geçeceğiz.
Ancak yıldız a gibi bir şey görürseniz, bunun gerçekten geçerli olduğunu düşünüp korkmayın.
Bu, yıldız işaretini işaretçi operatörü yapıyor.
İki nokta üst üste soru işaretini de görebilirsiniz.
Bu, karar vermek için kullanılan bir operatördür.
Koşul doğruysa, soldaki doğru ise, iki nokta üst üste işaretinden sonra sağdaki
değer değerlendirilir ve aksi takdirde bu şekilde devam eder.
Bir if-else deyimi için kısaltılmış bir gösterimdir.
Üçlü bir operatördür, buna denir. Ancak yine de bunları şu anda çok
ayrıntılı olarak tartışmak istemiyorum
çünkü özel konularımızdan bahsederken bunlardan da bahsedeceğiz.
Karar ifadeleri hakkında konuşurken döndürme operatörü hakkında konuşacağız. İşaretçilerden bahsederken
yıldız işareti operatöründen tekli olarak bahsedeceğiz.
Ancak şu anda bunu görüyorsanız ve teknik olarak operatör oldukları için şimdi bahsetmek istedim, ancak bu kavramlar
hakkında konuştuğumuzda kullanım durumlarını anlayacağız. Teşekkür ederim.