C öğrenmenin pratik yolu? [kapalı]


10

C'ye kazmak istiyorum ve normalde yeni bir dil öğrenmek istediğimde, pratik bir amacı olan basit / ulaşılabilir bir proje hedefi düşünüyorum (bir API'den faydalanmak, bir görevi otomatikleştirmek, vb.)

C için bir tane bulmakta zorlanıyorum çünkü okuduğum her şey şu anda C'nin birincil kullanımının gömülü sistemlerde ve işletim sistemleri gibi daha karmaşık yazılım projelerinde olduğunu gösteriyor.

Bu beni öğrenmem gerekmediği ya da sadece öğrenme stratejimde biraz daha kıvrımlı olmam gerektiğine işaret ediyor mu?

Pratik öğrenme kaynaklarına referanslar? (öğretici / bunun bir amacı / faydası olan bir sonuç üretir)


3
NEDEN C öğrenmek istiyorsan bize söyleyebilirsen daha mantıklı cevaplar alacaksın.
zvrba

2
Zvrba'ya katılıyorum. C, düşük seviyeli, hızlı şeyler ve sürücü kodu için mükemmeldir. Oyunlar için kod yazıyorsanız, bu da harika (muhtemelen, "standart dışı" kod yazdığınız için size şikayet edecek olan C ++ kodlayıcılarıyla çalışacaksınız). Bununla birlikte, Meclis ve C'nin Latince (konuşma dillerinde) benzer olduklarını hissediyorum, ilk değillerdi, ancak onlardan sonra gelenlerin çoğu, kendi dillerini oluşturmak için onlardan fikirleri ve yapıları kullandılar. Böylece, C MIGHT öğrenmeniz size daha üst düzey dilleri daha iyi anlamanıza yardımcı olur
Jamie Taylor

Eğer Zed Shaw'un kontrol ettiler öğrenin C Hard Way . Hakkında alabileceğiniz kadar pratik ve de oldukça ücretsiz.
Wyatt Barnett

Python the Hard Way kişi şimdi C için alfa versiyonu da dahil olmak üzere diğer diller için kitaplar var, ben orada başlıyorum. C yüksek seviye asm için büyük bir fark, yanlış olduğu gibi asm karşılaştırması nefret ediyorum. Nispeten diğer diller alışkanlık ne yapmak sağlar sağlar. C ile yazabileceğiniz herhangi bir uygulamayı ne yapmak istediğiniz önemli değil, uygulamayı dile hedeflemek için hiçbir sebep yok.
old_timer

Yanıtlar:


27

Sadece Kernighan ve Ritchie'nin C Programlama Dili'nin (2. Baskı) bir kopyasını almanızı tavsiye ederim . Her bölümün sonunda, C diline çok iyi bir giriş sağlamanın yanı sıra yapabileceğiniz bir dizi alıştırma vardır. Sizi dil ustası yapmaz, ancak kitabın sonunda ve C'de yazılmış , kaynağı okuyabileceğiniz ve katkıda bulunabileceğiniz açık kaynaklı bir proje bulmak için yeterince iyi bir kavrayışa sahip olmalısınız. için.

İçinde C kodu bulunan gerçek gerçek projeleri görmek istiyorsanız. Daha da zorlaşıyor - birçok proje "daha üst seviye" bir dil kullanıyor, ancak C hala hayatta ve tekmeliyor. C öğrenmek istiyorsanız, öğrenmeyi başarmak için tekerleği yeniden icat etmekten korkmayın. Çözümleri zamanında yeniden icat etmek iyi bir fikir değildir, ancak bunu akademik bir alıştırma olarak yapmak son derece iyidir.


1
Comp.lang.c adresinden SSS'yi buna ekleyin. c-faq.com
Mike Sherrill 'Cat Recall'

3
Öğrenmek için + 1'leri çözümleri yeniden keşfetmenin sakıncası yok.
CVn

4
K&R genel olarak iyi programlama tarzını öğrenmek ve özellikle güvenli / aklı başında C programlama uygulamalarını öğretmek için korkunçtur. İçindeki tüm kod parçacıkları en iyi şekilde gizlenir, çoğu zaman açıkça tehlikeli alışkanlıklar öğretirler. Eski bir kitap, nostalji ötesinde bir şey için tavsiye etmem. Özellikle yeni başlayan programcılar için uygun değildir.

2
@Thomas Evet 2. baskı. Hemen hemen herhangi bir kod snippet'i gösterebilir ve muhtemelen 2-3 tehlikeli / kötü uygulama örneğini işaret edebilirim. Kitabı şimdi açacağım ve rastgele bir örnek alacağım. Tamam işte buradayız, p119: koşullar içinde atama, yerel ilkel veri türlerinin kullanımı, örtük int (imzasız) kullanımı, malloc sonucunu belirleme (çok kötü!), Parametreyi boşluğa serbest bırakmak için * (neden ??? ), birden fazla döndürme (diğer adıyla spagetti), {} olmadan düzgün #include olmadan NULL kullanarak.

2
+ 1 KnR C. için. Okuduğum belirli bir dilde programlamaya en iyi (ve en özlü) giriş. Diğerlerinin işaret ettiği gibi, yerlerde biraz şüpheli olabilir - vereceğim tek tavsiye şudur: eğer çevredeki bulanıklığı okumanızı gerektiren bir programlama kılavuzu varsa, budur. Diğerleri, genellikle, kod bloğundan anlayabilirsiniz, ancak bu kitap en azından bir kez kapaktan okumanızı gerektirir.
Jamie Taylor

1

Bellek tahsisini gerçekten anlamanız gerekecek. Daha önce başka diller kullandığınızı duyuyorsunuz, ancak bu diğer diller, bellek yönetiminin kanlı ayrıntılarını sizden sakladı. C'de bellek yönetimi her zaman açıktır. Bunun bazı avantajları vardır, ancak doğru yapmak için dikkatli olmanız gerektiği anlamına gelir, aksi takdirde tüm Cehennem gevşeyecektir.

Kullandığınız platform için mevcut olan bellek hata ayıklama olanaklarını kullanın. Linux için Elektrikli Çit var, Mac OS X'te Guard Malloc var. Ayrıca bir dizi işletim sistemini destekleyen Valgrind vardır.

Serbest bırakılması gereken belleği serbest bırakmazsanız, bellek sızıntısı olur. Bunu yapmaya devam edin ve hafızanız bitecek. Destek mağazasında bile (çoğu insanın sanal bellek dediği şey), sistemin aşırı sayfalara gitmesine ve hatta takas alanınızın bitmesine neden olabilirsiniz.

Zaten boşaltılmış olan belleği serbest bırakırsanız, yığın ve çökmeyi bozarsınız, ancak muhtemelen hemen değil. Ayrıca, bir arabellek taşması durumunda yığını bozarsınız. Bellek hata ayıklama araçları tüm bunlara yardımcı olacaktır.

Birim testi de yardımcı olur.


0

Buradaki çoğu insanla bugün dillerin eldeki görev tarafından belirlendiğine katılıyorum. Bu konuda sınırlı seçeneğiniz olduğu bir zaman vardı. Günümüzde C, kod optimizasyonuna ihtiyaç duyulan Gömülü / Sistem programlama alanında kullanılmaktadır. Maksimum değeri elde etmek için kesin kodlar yazmanız gerekir, çünkü eğer o soyutlamayı kullanmaya başlarsanız, altta yatan şeylerin çok sağlam olması gerekir. Linux'un kendisi veya C geliştiricilerine ihtiyaç duyan bazı açık kaynaklı GNU projelerinde dolaşmaya çalıştığınızı söyleyebilirim. C'de sıfırdan bir şey yazmak yerine elinizi bu projelerde deneyin. Bu muhtemelen kod yazmanın ve bir dil öğrenmenin daha iyi bir yoludur.


Aslında, önce küçük, hatta bir proje sıfırdan bir dil öğrenmeye başlamak için iyi bir yol olduğunu, yerleşik bir içine atlamak şüpheliyim. Sen de elde etme olasılığınız olduğu şekilde başınızın üzerinden, hem de yapmanız için yola Tüm olsa bile, sadece kod gezinmek için çalışmakla ek yük olacak anlaşılması nasıl kod eserler. Özellikle bir işletim sistemi çekirdeği inanılmaz derecede karmaşık bir yazılım parçasıdır.
CVn

Evet, ama soru soran kişinin aslında K&R kitabından veya bunun gibi bir şeyden geçtiğini varsayıyorum. Python kanalında sorduğumda bu yaklaşımı tavsiye ettim. C'de fark olur mu?
Nishant

Açıkçası, bu kadar farklı olup olmayacağını bilmiyorum, ancak C'de, Pithon gibi üst düzey bir dilde olduğundan, nitrit-cesur ayrıntılara çok daha fazla dikkat etmeniz gerekiyor. Bellek yönetimi, tek bir şeyden bahsetmek gerekirse. Bir dil ile yeni başladığınızda kurulu, potansiyel olarak büyük bir projeye atlamak bunu yapmanın en iyi yolu olmayabilir.
CVn

0

Komut satırından çalışabilecek bir şey yapmak isteyeceksiniz. C'deki GUI programlama, iyi bir GUI çerçevesi olsa bile, kıçta büyük bir acıdır .

Pratik bir C öğrenme deneyimi için her zamanki önerim bir kişi listesi veya diğer basit veri yönetimi uygulaması oldu. Bu, önemli bitlerin çoğunu (G / Ç, bellek yönetimi, metin işleme vb.) Kapsayacaktır ve bunu başarmak için standart C kütüphanesinin dışında bir şey kullanmanız gerekmeyecektir. C'nin grafik, ağ, ses veya çok daha fazlası için yerleşik bir desteği yoktur 1 , bu nedenle C programlamaya ilk baskınız için bu tür şeylere dayanan herhangi bir şeyden kaçınmak en iyisidir.

olabilir genel amaçlı programlama için kullanılabilir; beklentilerinizi biraz düşürmeniz gerekiyor (1983 olduğunu ve bir VAX 11/750'ye bağlı bir VT52'nin önünde oturduğunuzu hayal edin ve doğru zihniyette olacaksınız).

Unutmayın, C'nin bıçak koruması yoktur ve aptalca bir şey yapmanıza engel olmaz. Dil tanımı yerlerde biraz gevşek ve bu kadar yasadışı olmayan , ancak iyi tanımlanmamış bazı işlemler var .


1 - Dil standardının en son (2011) revizyonu, dahili iş parçacığı desteği ekledi


0

Project Euler'i tavsiye ederim . Benim C ++ geliştirmek için kullandım ve harika. Bu harika çünkü her problemin tamamlanması bir saatten az bir süre alabilen küçük bir görevdir (en azından ilk problemler).

Bir profil oluşturucuya ve kodu hız için optimize etme hakkında bir kitaba ihtiyacınız olacaktır. 1 dakikalık kurala uyduğunuzdan emin olun: Cevabı 1 dakika içinde almalısınız.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.