Merhaba, tekrar hoş geldiniz.
Bu derste, c dilinde programlama yaparken yapabileceğiniz bazı yaygın hatalardan
bahsetmek istiyorum.
Bunlardan bazılarına daha önceki mücadelelerinizden aşina
olabilirsiniz ve bu hatalarla zaten karşılaşmışsınızdır,
ancak bunlar en yaygın hata türleridir.
Birincisi çok ama çok açık. Noktalı virgül eksik.
c'deki tüm ifadelerin noktalı virgülle biteceğini unutmayın.
Eğer orada yoksa, derleyici şikayet edecektir.
Dolayısıyla, noktalı virgülün yanlış yerleştirilmesi ya da tamamen atlanması
gerçekten yaygın bir hatadır. Bu durumda, noktalı virgülü yanlış yerleştiriyoruz.
Bir if deyimimiz var. if deyiminin sonuna noktalı virgül koyuyoruz.
Bu da aslında programın davranışının tamamen farklı olmasına neden olur.
Bu gerçekten derlenecektir.
Noktalı virgülü atladığınızda ve hatta dahil etmediğinizde, derlenmeyecektir.
Ancak bu durumda, if deyimindeki noktalı virgül yerleştirildiği
için j değeri her zaman sıfır olarak ayarlanacaktır.
Dolayısıyla, noktalı virgülün if ifadesinden sonra olması tamamen geçerlidir.
Aslında null ifadesini temsil eder.
Bu nedenle, derleyici tarafından bir hata almazsınız,
ancak bu bir soruna neden olur çünkü j hiçbir zaman sıfıra ayarlanmayacaktır.
Ve bu tür bir hata döngüde de yaygın olabilir.
Bir döngüye sahip olduğunuzda ve for döngüsünün sonuna noktalı
virgül koyduğunuzda ve ardından bir köşeli paranteziniz olabilir, burada köşeli paranteziniz
yoktur çünkü köşeli paranteziniz varsa bir hata alırsınız, çok yaygındır.
Bir diğeri de eşittir işlecini eşittir eşittir işleciyle karıştırmaktır.
Özellikle eşittir eşittir işlecinin dizeleri karşılaştırmadığından
bahsedilmiştir. Dolayısıyla, dizeleri karşılaştırırken eşittir
eşittir kullanırsanız, bu geçerli değildir. Sadece referansları karşılaştıracak.
Ancak bir değişkene gerçekten bir değer atamak istiyorsanız ve bunun yerine
eşittir eşittir'i kullanıyorsanız, bir derleyiciniz olacaktır.
Şimdi, bir if deyiminin içinde iki tamsayı gibi iki öğeyi karşılaştırmaya
çalışırsanız ve bunun yerine atama operatörünü kullanırsanız, aslında
bir derleyici hatası almazsınız, ancak bu ifade her zaman
true olarak değerlendirilecektir.
Dolayısıyla, eşittir'i kullandığınızda ve eşittir eşittir'i kullanmadığınızda,
bu genellikle if while do deyiminde, Boolean ifadesinin içinde yapılır.
Ve bu, bir şeyi yürütmek yerine bir şeye
atama etkisine sahip olması dışında geçerlidir.
Yani bu örnekte,
eğer a eşittir 2 varsa, a'ya 2 atanıyor demektir.
Her zaman true olarak ayarlanır çünkü bu doğru bir ifadedir çünkü ödev yaparken
asla başarısız olmazsınız. Ve böylece printf her zaman çalışacaktır.
Burada gerçekten yapmak istediğiniz şey, a eşittir eşittir demekti.
Bu nedenle, eşittir eşittir yerine eşittir kullanılması ve ardından
derleyici hatası alınmaması çok yaygındır.
Equals eşittirini yanlış durumda kullanırsanız,
beklenmedik bir davranışla da karşılaşabilirsiniz,
ancak atama için yanlış kullanıyorsanız derleyici
hatası alırsınız.
Ancak eşittir eşittir yerine eşittir ile buna dikkat edin.
Prototip bildirimlerinin atlanması.
Fonksiyonlarınızı kullanmadan önce her zaman dosyanın en üstünde bildirmenin
gerçekten önemli olduğundan bahsetmiştim.
Ancak, bu her zaman gerçekleşmez ve çok yaygın bir hatadır.
Ve genellikle derleyicide örtük bir bildirim hatası
alırsınız.
Bu örnekte, karekökü programda çağırdığınız yerden
daha sonra veya başka bir dosyada tanımladıysanız ve
bunu açıkça bildirmediyseniz,
bazı uyarılar alacaksınız.
Derleyici, fonksiyonun bir int döndürdüğünü varsayacaktır.
Programınıza doğru başlık dosyasını ekleyerek açık veya dolaylı
olarak çağırdığınız tüm işlevler
için en üstte bu prototip
bildirimini dahil etmek her zaman en güvenlisidir.
Ancak bunu dahil etmediğinizde, bu prototip bildirimlerinde hata
alabilirsiniz.
Programda kullanılan bir c programlama kütüphanesi fonksiyonunun tanımını
içeren başlık dosyasının dahil edilmemesi.
Yani bu durumda, bazı kodları yeniden kullanmak istiyorsunuz. Belki bazı çıktıları görüntülemek istediğiniz
printf fonksiyonuna sahipsiniz, ancak standart lib başlık dosyasını dahil etmiyorsunuz.
Bu bir hata. Ve bu genellikle derleyici tarafından size söylenecektir.
Bu işlevle ilgili bağlantı sorunu
olacaktır.
Yani bu durumda, çift cevabımız karekök değeri 1'e eşittir.
Eğer bu program matematiği içermiyorsa. başlık dosyası, karekökün
tanımsız olduğuna dair bir hata oluşturacaktır.
Nesne dosyalarını bağlamaya çalışacaktır. Matematiği olmayacak. o.
Ve diyecek ki, hey, karekökü çağırıyorsun, ama bunun için bir uygulama yok.
Bu nedenle, özellikle standart kütüphanedeki tüm fonksiyon
çağrılarınız için doğru başlıkları eklediğinizden emin olun.
Bir karakter dizesinde bir karakter sabitinin karıştırılması.
Yani burada tek tırnak içinde text equals a varsa,
bu text'e atanan tek bir karakterdir.
text adında bir değişkenimiz varsa ve çift tırnak içinde atama
yaparsak, bu karakter dizesine bir işaretçidir.
Bu tek bir karakter için geçerli
değildir.
Ve bu aslında dize sabitlerinden ve bunları
karakter dizilerine atamaktan bahsettik.
Ve bunu eşitler ile yapamayacağınızı ve aslında bunları yıldız
kopyası ile yapmanız gerektiğini.
Bu durumda, metin eşittir a dediğimizde, bir işaretçi atar ve
bu da aslında geçerli değildir ve
yapmanız gereken şey, doğrudan bu şekilde atamak
istemiyorsanız yıldız metin eşittir a veya yıldız kopyalama yapmanız gerektiğidir.
Ama anladın sen.
Tek tırnak içinde bir a ile çift tırnak içinde bir karakter kullanmak
tamamen farklıdır, karaktere karşı dize.
İlk durumda, metin normalde bir char değişkeni olarak bildirilir.
İkinci durumda ise, char türünde bir işaretçi olarak bildirilmelidir.
Ve bu işaretçiye işaretçinin kendisi dışında bir değer atamak
isterseniz, onu referans dışı bırakmanız gerekir.
Bu aslında yanlıştır, çünkü bir adres atamak
yerine bir işaretçi ise, ona bir dize atarsınız, bu yüzden bu mantıklı
değildir.
Bir dizi için yanlış sınırların kullanılması, dizi sınır dışı istisnası.
Burada, 100 boyutlu bir tamsayı dizisi ve ardından yalnızca bazıları
ilklendirilen birkaç I ve sum değişkeni bildiriyoruz.
Ve döngümüzün içinden geçerek I eşittir 1 için I eşittir 100'den küçüktür diyoruz.
Bu yanlıştır çünkü yüz boyutu, dizide yüz öğe olduğu
anlamına gelir. Ancak diziler sıfır tabanlıdır.
Yani ilk eleman sıfırdır. a dizisinde atayabileceğiniz
veya erişebileceğiniz maksimum dizin 99'dur.
Bu eşitlikten daha az olacak.
Yani burada sınır dışı bir hata yapacaksınız.
Bu geçerli bir alt simge değildir
çünkü bu döngü 100'e kadar gidecektir.
Ayrıca muhtemelen yanlış çünkü 1'den başlıyorsunuz.
Bu dizinin ilk elemanını gerçekten isteseydiniz, 0'dan başlardınız.
Bir dizinin sonlandırıcı null karakteri için dizide
fazladan bir yer ayırmayı unutmak da yaygın
bir sorundur.
Karakter dizilerinizi bildirirken, sonlandırıcı tek karakteri içerecek kadar büyük olmaları gerekir.
Bu nedenle, eğer bir diziyi ilklendiriyorsanız,
onu oluştururken içine bir boyut koymamanızı öneririm.
Boyutu yalnızca onu başlatmıyorsanız oraya koyarsınız.
Aynı satırda başlatma oluşturuyorsanız, bırakın işi c sizin için yapsın,
otomatik olarak doğru boyutu koyacak ve null sonlandırıcıyı içerecektir.
Örneğin, hello adında bir karakter diziniz varsa, bu beş
bellek konumundan daha fazladır, sondaki null sonlandırıcı nedeniyle altıdır.
Dizilerinizin boyutunu unutmayın.
Bu, işaretçilerle ilgili çok fazla tartışmadığımız yaygın bir sorundur, ancak
çok yaygın olduğu için sadece bahsetmek istedim.
İşaretçilerde, bir işaretçiyle bir şeye erişmek istediğinizde
veya hatta talimat vermek istediğinizde,
tire büyüktür sembolünü kullanmanız gerekir.
Bu, bir işaretçi öğesine erişirken kullanılır.
Yani bir yapıya işaret eden bir işaretçiniz varsa, ona bu şekilde erişirsiniz.
Eğer bir yapınız varsa, bu bir işaretçi
değildir, o zaman nokta operatörünü kullanarak erişirsiniz.
Çoğu zaman bu nokta operatörü ve bu tire sonra daha büyük
yanlış kullanılır.
İşaretçi olmayanlar için nokta, işaretçiler daha büyük çizgi, bu daha
fazla örneğimizde netleşecektir.
Bir scanf çağrısında işaretçi olmayan değişkenlerden önce ve işaretinin atlanması.
Bu yüzden scanf çağrımızın ikinci argüman olarak bir işaretçi beklediğini ve bunun da bir adres
anlamına geldiğini unutmayın.
Bir veri türünü int türünde bir değişken olarak bildirdiğimizde, bu bir
işaretçi değildir.
Dolayısıyla scanf'in bu verileri int değişkenimizde depolamasına izin vermek için, bunun bir adres olduğunu
söylemek üzere ona ve işaretini geçirmemiz gerekir.
Yani bu yanlış, sayıdan önce
ve işaretinin olmaması ve ikinci bağımsız değişken olarak f'nin
taranması geçerli değil. Sadece karakter dizisi gibi bir işaretçi kullanıyorsanız
ve işareti kullanmazsınız.
Biçim dizesi ve scanf'ten sonra görünen tüm argümanlar işaretçi olmalıdır.
Bir işaretçi değişkeni ilklendirilmeden önce kullanmak.
İşte bir işaretçi oluşturmanın ve ardından ona atama yapmaya çalışmanın bir örneği.
Ve bu, referansını kaldırdığınız bir değeri atadığınız doğru atamadır.
Ancak burada yapmadığımız şey, işaretçiyi kendisi için ayrılmış herhangi bir belleğe sahip
olacak şekilde başlatmış olmamızdır
ve bunu c'de yapamazsınız.
Bir noktaya ya da değişkene yalnızca değişkeni
bir yere işaret edecek şekilde ayarladıktan sonra
yıldız işareti olan dolaylama operatörünü uygulayabilirsiniz.
Yani bir yere işaret ediyor olmalı, şu anda null, hiçbir yere işaret etmiyor çünkü herhangi
bir bellek ayırmadınız.
Bu nedenle char işaretçisi hiçbir zaman herhangi bir şeyi gösterecek şekilde ayarlanmaz, dolayısıyla atama anlamlı değildir.
Bu aslında bir segmentasyon hatasına neden olur.
Bir başka yaygın hata da switch deyiminde case'in sonundaki break deyiminin atlanmasıdır.
Bir vakanın sonuna break eklenmezse, yürütme bir sonraki vakaya devam eder.
Yani bahsettiğim şey, bir vakanın olduğu ve değerlendirildiği yer.
Ve eğer orada bir kesme işareti yoksa, doğrudan bir sonraki duruma
geçer ve bir sonraki durumun içindeki kodu çalıştırır.
Bu nedenle, case ifadelerinizin içinde her zaman kesmeler olmasını istersiniz.
Bazen başka bir vakayı takip etmek istediğinizde ve onlar
da aynı şeyi yaptığında, bu durumda vaka bildiriminin
içinde hiçbir şey olmaz.
Bir önişlemci tanımının sonuna noktalı virgül ekleme.
Önişlemci tanımlarının sayı ve pound sembolü
ile başladığını unutmayın. Önişlemci genellikle optimizasyon için derleyiciden
önce çalıştırılır.
Önişlemci tanımları için doğru sözdizimi noktalı virgül içermemektir.
Ancak, siz de her şeyden sonra noktalı virgül koymayı alışkanlık haline getirin.
Ancak, noktalı virgüle ihtiyaç duymadığınız bazı sabit veriler tanımlarsanız,
bunun yanlış olduğunu unutmamalısınız.
Bu şekilde bir ifade kullanılırsa
sözdizimi hatası oluşur.
Bunun gibi. Yani bunu gerçekten bulmaya çalışırsanız,
sonunda noktalı virgül olması sorun olmayacaktır.
Ancak önişlemci çalıştığında, bu tanımda ne varsa tam olarak onu ekleyecektir.
Yani 999 kolonluk verinin sonuna hizmet edecek.
Derleyici bunu böyle görecek ve aslında bir hataya neden olacaktır, bu bir sözdizimi
hatası olacaktır.
Herhangi bir ifadede kapanış parantezinin veya kapanış tırnak işaretinin
atlanması çok yaygındır. Yani bu aynı zamanda parantezlerle de doğrudan
ilişkilidir, küme parantezinin başlaması ve küme parantezinin bitmemesi, parantezlerle
aynı şeydir. Bu durumda, iki başlangıç
sol parantezimiz veya üç parantezimiz vardır, ancak yalnızca iki
bitiş parantezimiz vardır. Sağ parantezin sonu eksik.
Bu, derleyicinin bulacağı bir sözdizimi hatası olacaktır.
Dolayısıyla, bir denklemin her bir bölümünü ayırmak için parantez içinde gömme kullandığınızda, daha
okunabilir bir kod satırı elde edersiniz.
Parantez kullanmak istiyorsunuz.
Ancak, bir parantez başlattığınızda hepsinin eşleştiğinden
emin olmak istiyorsanız, bir bitiş kapanış parantezine sahip olmalısınız, aynı şey küme parantezleri için de geçerlidir.
Bir küme parantezi başlatırsanız, bir bitiş küme parantezi olması gerekir.
Yani ya çok fazlanız vardır ya da çok azınız ama
derleyici şikayet edecektir ve bu çok çok yaygındır.
Buradaki ikinci satırda da bir kapanış tırnak işareti eksik, bu print deyimi.
Son bir teklifimiz yok.
Derleyici bu konuda şikayet edecektir.
Bunların her ikisi de bir derleme hatası oluşturacaktır.
Ancak bazen derleyici hatanın nerede oluştuğunu bilmediği
için çok yanıltıcı olabilir. Hatanın sonraki bir satırda meydana gelmiş olabileceğini düşünüyor.
Bu yüzden size hatayı söylediği satır yanıltıcı olabilir.
Dolayısıyla, derleyicinin sonraki satırda
bir parantez veya tırnak işareti kullanmasına bağlı olarak,
aslında bu ifadeyi tamamlayacaktır.
Böylece hatayı başka bir satıra taşıyacaktır.
İşte bu yüzden şikayet edecek ve hatanın burada olduğunu söyleyecektir. Ancak asıl hata, yerleştirmek
istediğiniz yerin daha yukarısında.
Bunlar, birçok c programcısının yaptığını gördüğüm bazı yaygın
hatalar.
Düzeltmesi kolay. Eğer bunları anlar ve üzerinde çalışırsanız,
bunları yapmamanız gerektiğini
de bilirsiniz. Yeni başlayan biri olarak bunları
yapmakta sorun yoktur, ancak daha fazla kod yazdıkça ve daha fazla
pratik yaptıkça, hey, bir parantezi unuttum, bir köşeli ayraç unuttum,
eşittir ve eşittir eşittiri doğru kullanmadım, işaretçileri yanlış kullanıyorum,
hiç bellek ayırmadım gibi şeyleri fark edeceksiniz.
Tüm bunlar daha sonra ikinci doğaya dönüşecektir. Teşekkür ederim.