C ++ öğrenmeden önce C öğrenmeli miyim? [kapalı]


116

Bugün bir üniversite bilgisayar bilimleri bölümünü ziyaret ettim ve laboratuar turunda lisans öğrencilerinden birkaç son yıl projesiyle oynamak için oturduk. Biri özellikle iyiydi - bir tür FPS asteroit oyunu. srcC ++ ile yapıldığını bulmak için dizine bir göz atmaya karar verdim (diğer projelerin çoğu Java 3D uygulamalarıydı).

Daha önce hiç C yapmadım ama daha önce bazı C kodlarına baktım. Bu oyunda .cpp kodunda gördüğümden çok farklı görünmüyordu.

C veya C ++ öğrenmekle ilgileniyorum ama muhtemelen diğerini daha sonra öğreneceğim. Beni diğer önce bir öğrenme için herhangi bir avantajı var mı ve eğer öyleyse, bir tane?



7
Gerçekten bir kopya değil. Örtük olarak bu soru "önce OOP'yi mi yoksa prosedürel programlamayı mı öğrenmeliyim" diye soruyor
bobobobo

2
Aşağıdaki cevaplara geçmeden önce (IMO daireler çizilir), biraz tavsiye vermeme izin verin: DOĞRU : C ++ , C'ye uygulanan tüm özellikleri ve nitelikleri korur, dolayısıyla dolaylı olarak C'yi ' geçersiz kılar ' (Aşağıdaki cevapların çoğunun denediği nokta yapmak). ANCAK : C değil , değil , değil ÖLÜ. İnsanlar sevgili yaşam için ' her ikisini de öğrenmeye gerek yok ' kinayesini kavrıyor gibi görünüyor , ancak gerçekte bunun temeli yok. C, C ++! = C kaynaklı sözdizimini ödünç almak için . C ++ 'yı bilmek sizi nitelikli bir C geliştiricisi yapmaz ve aynı şekilde C'yi bilmek sizi nitelikli bir C ++ geliştiricisi YAPMAZ.
Super Cat

4
DEDİ : C ++ 'ya girmeden önce C'yi almanın bir zararı yok - Ne kadar çok bilirseniz, o kadar iyi olursunuz - Ama tam tersine, nihai hedefiniz C ++ öğrenmekse C öğrenmenize gerek yok . C ++ öğrenmek istiyorsan git C ++ öğren ve C öğrenmek istemiyorsan C öğren . Her ikisinin de avantajları ve dezavantajları vardır (C ++ 'ın basitliği ve aşırı derecede C ++ özellikleri kendi yollarıyla hem lanet hem de lütuftur) ve her ikisi de bugün hala kullanılmaktadır (gömülü sistemler için C, Unity, PHP vb. - C ++ ayrıca Unity, Unreal, vb. için).
Super Cat

3
NOKTA: C ++ öğrenmek ister misiniz? Sonra C'yi atlayın. İhtiyacınız yok. C öğrenmek ister misin? O zaman güzel, git C'yi öğren. İkisini de öğrenmek istiyorsan önce C'ye git. İkisinin de dünyada yeri var, bu yüzden ikisinin de diğeri için yeterli olduğunu düşünmeyin.
Süper Kedi

Yanıtlar:


121

C ++ 'ı öğrenmeden önce C öğrenmeye gerek yoktur.

Farklı dillerdir . C ++ 'nın bir şekilde C'ye bağlı olduğu ve kendi başına tam olarak belirtilmiş bir dil olmadığı yaygın bir yanılgıdır.

Sırf C ++ aynı sözdizimini ve aynı anlambilimin çoğunu paylaşıyor olması, önce C'yi öğrenmeniz gerektiği anlamına gelmez.

C ++ 'ı öğrenirseniz, zamanla öğreneceğiniz diller arasındaki bazı farklılıklar ile sonunda C'nin çoğunu öğreneceksiniz. Aslında düzgün C ++ yazmak çok zor bir şey çünkü orta düzey C ++ programcıları C / C ++ yazma eğilimindedir. C ile başlasanız da C ++ ile başlasanız da bu doğrudur.

Önce C'yi biliyorsanız, bu C ++ öğrenmek için iyi bir artıdır. Dilin bir kısmını bilmekle başlayacaksınız. Önce C'yi bilmiyorsanız, o zaman farklı bir dile odaklanmanın bir anlamı yoktur. Sizi hiçbir şey bilmeden başlatan ve C ++ için de geçerli olan C'den öğreneceğiniz her şeyi kapsayacak çok sayıda iyi kitap ve öğretici bulunmaktadır.

Lütfen bu cevapta daha fazla gerekçeye bakın .


33
Daha fazla katılmıyorum. C ++ 'ı öğrenmek önce C'ye "geri dönmek" çok zor bir deneyim yaşatır. C temel, yalnızca temel bir sistem dilidir. C ++ yepyeni bir oyun, her iki dildeki herhangi bir soruna yaklaşımlar çılgınca farklı olacaktır. Bir C ++ işine atlamadan önce C ile uğraşacak kadar şanslıydım. Sonuç olarak, C ++ 'nın sağladığı sözdizimsel şekeri zihinsel olarak "kaynatabilirim" ve her iki dildeki sorunlara yaklaşabilirim. C'yi dil çiftinin "işe yarayan" parçası olarak tanımlamak benim için çok kolay. Önce C ++ öğrenmek, programcıların kafasının karışmasına ve yanlış yönlendirilmesine yol açacaktır.
Matt Joiner

24
@Matt: Önce C ++ 'ı öğrendim ve yanlış yönlendirilmiş bir programcı değilim. Yani iddianız doğru değil, karşı örnekle kanıtlayın. Ve evet, C'de altın rozetim de var. İşin doğrusu iki farklı ve farklı dil olmalarıdır. Diğerini öğrenmek için bağımlılık olarak bir dile ihtiyacınız yok. Bu sadece aptalca bir yanılgıdır.
Brian R. Bondy

8
@Matt: Ayrıca bağlantılı yazımdan: Önce C ++ 'ı öğrenmelisiniz, önce C'yi öğrenmek size zarar vereceği için değil, herhangi bir şeyi unutmanız gerekeceği için değil (yapmayacaksınız), ama önce C'yi öğrenmenin bir faydası olmadığı için. Eninde sonunda C ile ilgili hemen hemen her şeyi öğreneceksiniz çünkü C ++ 'da aşağı yukarı yer almaktadır.
Brian R. Bondy

11
@Matt: Hala anlamadığın için üzgünüm. C ve C ++ 'nın bir Venn diyagramını çizin ve kesişen kısımlara bakın. C ++, yalnızca kesişmeyen kısımlardan değil, çizdiğiniz tüm C ++ dairesinden oluşur. Önce C'yi biliyorsanız, sizin için iyi, C ++ 'ı daha hızlı öğrenebilirsiniz. Önce C'yi bilmiyorsan, önce onu öğrenmen için bir sebep yok. C ++ üzerindeki her kitabın işaretçileri ve bellek yönetimini ve dizgi değişmezlerini vb. Kapsamayacağını düşünüyor musunuz? Şimdi tartışmayı bırakacağım ama kapanış yorumlarınızı bırakmaktan çekinmeyin.
Brian R. Bondy

11
@Matt: C, C ++ 'ın daha iyi anlaşılmasına nasıl yol açar? Genellikle, C ++ öğrenen C programcıları çirkin, hataya açık "sınıflarla C" stil kodu yazarlar. Bunun her zaman olduğunu söylemiyorum , ama C ile başlarken en doğal ilerlemedir çünkü C, C ++ 'nın o korkunç tarzına "modern" C ++' dan çok daha yakındır.
jalf

77

Bu soruyu seviyorum - "önce ne öğrenmeliyim, snowboard mu yoksa kayak mı?" Snowboard yapmak mı yoksa kayak yapmak mı istediğinize bağlı. İkisini de yapmak istiyorsanız, ikisini de öğrenmelisiniz.

Her iki sporda da, bu soruyu kışkırtmaya yetecek kadar benzer cihazlar kullanarak karda bir tepeden aşağı kayarsınız. Bununla birlikte, aynı zamanda yeterince farklıdırlar, böylece birini öğrenmek, diğerinde size pek yardımcı olmaz. C ve C ++ ile aynı şey. Sözdiziminde yeterince benzer diller gibi görünseler de, OO kodunu yazmak için prosedürel kod yazmak için ihtiyaç duyduğunuz zihin seti yeterince farklıdır, bu nedenle, ikinci olarak öğrendiğiniz dil ne olursa olsun, hemen hemen baştan başlamanız gerekir.


70

Önce C'yi öğrendim ve C ++ 'ı öğrenmeden önce C kullanılan veri yapılarında bir kurs aldım. Bu benim için iyi çalıştı. C'de bir veri yapıları kursu, bana işaretçiler ve bellek yönetimi hakkında sağlam bir anlayış kazandırdı. Bunun ne olduğunu öğrendiğimde, nesne yönelimli paradigmanın faydalarını da açıkça ortaya koydu.

Kapak tarafında, önce C'yi öğrenerek, başlangıçta kötü C ++ kodu yazmama neden olan bazı alışkanlıklar geliştirdim, örneğin aşırı işaretçi kullanımı (C ++ referanslarının yapacağı zaman) ve ön işlemci gibi.

C ++, birçok özelliğe sahip gerçekten çok karmaşık bir dildir. Gerçi aslında C'nin bir üst kümesi değil. Daha ziyade, C'ye çok benzeyen, temel prosedürel programlama yapılarını (döngüler, ifs ve fonksiyonlar) içeren bir C ++ alt kümesi vardır. sınıflar ve şablonlar gibi.

En önemli şey, IMHO, beyniniz dünyaya tek bir bakış açısına donmadan önce, prosedürel, nesneye yönelik, işlevsel ve mantıksal gibi farklı programlama paradigmalarına maruz kalmaktır. Bu arada, Scheme gibi işlevsel bir programlama dili öğrenmenizi de şiddetle tavsiye ederim. Gerçekten ufkunuzu genişletirdi.


18

Her ikisini de öğrenmeye karar verirseniz (ve diğer insanların da bahsettiği gibi, ikisini birden öğrenmeye açıkça gerek yoktur), önce C'yi öğrenin. C'den C ++ 'ya gitmek doğal bir ilerleme gibi geliyor; diğer tarafa gitmek, kasıtlı olarak bir elini arkadan bağlamak gibi geliyor. :-)


13

Bence önce C'yi öğrenmelisin, çünkü önce C'yi öğrendim. C bana sözdizimi ve hepsi C ++ 'ya akan işaretçiler gibi şeylerle ilgili iyi bir kavrayış sağladı.

Bence C ++, tüm bu sorunların toparlanmasını kolaylaştırır ([] operatörünü ve tehlikeli bir indeksi kullandığınızda taşmayacak bir diziye mi ihtiyacınız var? Elbette, sınır kontrolü yapan bir dizi sınıfı yapın) ama bilmeniz gerekenler işlerin neden belirli şekillerde yapıldığını anlamadan önce onlar tarafından ısırılırlar ve ısırılırlar.

Her şey söylendiğinde ve yapıldığında, C ++ 'nın genellikle öğretilme şekli "C ++ nesnelerle C'dir, işte C meselesi ve işte tüm bu OO şeylerinin nasıl çalıştığı", bu nedenle herhangi bir gerçek C ++' dan önce temel C'yi öğrenmeniz muhtemeldir. yine de çoğu metni takip edin.


Katılmıyorum. C ++ programlama kitabının içine girmeye değecek herhangi bir kitap, dizilerin nasıl çalıştığı (ve taşmanın nasıl önleneceği) gibi en azından bazı "aldatmacaları" kapsayacaktır
moonman239

12

Buradaki çoğunluğa katılmayacağım. Bence yapmalısın ++ C öğrenme önce C öğrenirler. Kesinlikle gerekli değil ama bence C ++ öğrenmeyi çok daha kolay hale getiriyor. C, C ++ 'ın kalbindedir. C hakkında öğrendiğiniz her şey C ++ için geçerlidir, ancak C çok daha küçüktür ve öğrenmesi daha kolaydır.

K & R'yi alın ve okuyun. Kısadır ve size yeterli bir dil duygusu verecektir. İşaretçilerin ve işlev çağrılarının temellerini öğrendikten sonra, C ++ 'ya biraz daha kolay geçebilirsiniz.


15
Yanlış. C'nin size öğrettiği hemen hemen her şey C ++ 'da kötü bir uygulamadır. C, C ++ 'ın kalbinde yer almıyor, sadece pek çok sözdizimi paylaşıyor. Lütfen, dünyada zaten fazlasıyla "sınıflarla C" programcısı var. C veya C ++ öğrenin. Ama C'nin bir C ++ lite olduğunu düşünmeyin.
jalf

13
Sözlerimin arkasında duruyorum. C ++, C'nin üzerine inşa edilmiştir ve bu nedenle C onun kalbindedir. C ++ 'da kullanılan deyimler, C'de kullanılanlardan çok farklıdır, ancak sözdizimi aynıdır. C ++ 'ı programlamanın doğru yolu C ile başlayarak öğrenilebilir. C ++ Primer'e bakın. Temelde bunu yapar.
Steve Rowe

6
+1. C daha küçük bir dildir, bu nedenle öğrenmesi daha kolaydır. C ile geriye doğru uyumlu olma girişimi, C ++ ile ilgili başlıca sorunların bir kaynağıdır, diğeri ise C ++ programcılarının% 90'ının kullanamayacağı kadar karmaşık olan şablon sistemidir.
hillu

1
Değişkenlerin, türlerin [işaretçiler ve nitelikler dahil], kapsamın, işlevlerin, ön işlemcinin ve bağlantının anlaşılması hem C hem de C ++ için çok önemlidir. C ile bu kavramları öğrenmenin daha kolay olacağını söyleyebilirim, böylece sınıfları bilmekle static, şablonların başka bir anlamıyla (ve derleyicilerin yaydığı gülünç derecede korkutucu şablon hatalarıyla)
uğraşmak zorunda kalmazsınız

1
Haklısın. Aslında C'yi öğrenmek iyi olabilir, böylece daha sonra kökleri hakkında daha iyi bilgi sahibi olarak C ++ 'ya geçebilirsiniz.
Daniel Daranas

10

C ++ öğrenme sürecinde C'nin çoğunu da öğreneceksiniz. Ancak C ++ kodunun çoğunun geçerli olmadığını unutmayın. C ++, C koduyla uyumlu olacak şekilde tasarlanmıştır, bu yüzden önce C ++ öğrenin derim. Brian bununla ilgili harika bir cevap yazdı .


8

Hayattaki diğer birçok sorunun cevabı gibi, değişir. Programlama ilgi alanlarınızın ve hedeflerinizin ne olduğuna bağlıdır. Masaüstü uygulamalarını, belki de bir GUI ile programlamak istiyorsanız, C ++ (ve OOP) muhtemelen gitmenin daha iyi bir yoludur. Bir x86 yonga seti dışında bir şey üzerinde donanım programlamasıyla ilgileniyorsanız, C genellikle hızı için daha iyi bir seçimdir. Yeni bir medya oynatıcı oluşturmak veya bir iş uygulaması yazmak istiyorsanız, C ++ 'yı seçerim. Galaksi çarpışmaları veya akışkan dinamiklerinin bilimsel simülasyonlarını yapmak istiyorsanız, C'nin gücüne bakın.


4
Birçok yüksek performanslı bilgi işlem senaryosunda, bu birkaç yüz saat döngüsü gerçekten önemlidir.
Scottie T

1
@ScottieT: restrictC belirtecinin dışında performansla ilgili C ++ 'dan başka hiçbir sözdizimsel / anlamsal yapıya sahip olmadığı göz önüne alındığında , neden tam olarak C ++ kodu, daha zengin sözdizimi ve örneğin meta programlamanın daha yavaş kod vermesi gerektiğini düşünüyorsunuz? İfade şablonlarını biliyor musun?
Sebastian Mach

1
@phresnel: Alaka düzeyi. C ++, genellikle satın almaya değmeyen özelliklere sahip son derece karmaşık bir dildir. Genel bir kural olarak, C, karmaşıklık açısından önemli ölçüde daha düşük bir maliyetle C ++ ile aynı performans fırsatlarını sunar .
Matt Joiner

1
@MattJoiner: Sürdürülebilirlik / Genişletilebilirlik de performans faktörleridir, ancak bilimsel kodun genellikle tek seferlik olduğunu fark ettim. Bununla birlikte, ifade-şablonlar-bağımsız değişkenini tekrarlayarak (örnek olarak), C ++ 'nın daha fazla optimizasyon fırsatına sahip olduğunu söylüyorum (ayrıca ifade-şablon-kodu yazmak iç koddan daha kolay olduğu için), bir istisna dışında ( restrictancak tüm büyük C ++ derleyicisi bir uzantı olarak sağlar). Aynı kod verildiğinde, aynı derleyici verildiğinde, C ++ ve C arasında performans açısından herhangi bir fark olacağını gerçekten düşünüyor musunuz? [...]
Sebastian Mach

1
@MattJoiner: [...] ve "C ++ 'ı ne kadar sevmediğim kadarıyla" gibi ifadeleri okurken, bu tartışmada biraz önyargılı olduğunuz varsayımını oluşturmama izin veriyor. C ++ kodunun daha kötü performans göstermesini sağlayan şey tam olarak nedir? C aynı performans fırsatlarına sahipse, ifade şablonlarının, genel olarak şablonların, içsel olmayan veri türlerinde derleme zamanı hesaplamalarının, functor'ların eşdeğeri nedir? Maliyet / bakım faktörü ekleniyor: RAII, operatör / işlev aşırı yükleme, genel standart kapsayıcılar, standart iş parçacıkları, genel standart algoritmalar, referanslar?
Sebastian Mach

8

C'yi öğrenmek, kodunuzu yazdığınız sırada açık ve örtük bellek yönetimi veya temel veri türlerinin depolama boyutları gibi bazı konular hakkında daha fazla düşünmenizi sağlar.

C'nin özellikleri ve yanlışlıkları konusunda kendinizi rahat hissettiğiniz bir noktaya ulaştığınızda , muhtemelen C ++ 'da öğrenme ve yazma konusunda daha az sorun yaşayacaksınız.

Gördüğünüz C ++ kodunun standart C'den çok farklı görünmemesi tamamen mümkündür, ancak bunun nedeni nesneye yönelik olmaması ve istisnalar, nesne yönelimi, şablonlar veya diğer gelişmiş özellikler kullanmaması olabilir.


8

Bence önce C'yi öğrenmek iyi bir fikir.

Comp bilimi derslerinin hala C kullanmasının bir nedeni var.

Benim görüşüme göre, konunun tüm "kalabalıklaşmasını" önlemek, OOP gerektirme yükümlülüğünü taşır.

Prosedürel programlamanın programlamayı ilk öğrenmenin en doğal yolu olduğunu düşünüyorum. Bunun doğru olduğunu düşünüyorum çünkü günün sonunda sahip olduğunuz şey var: birbiri ardına çalıştıran kod satırları.

Bugün pek çok metin "önce nesneler" yaklaşımını zorluyor ve dizileri tanıtmadan önce arabalar ve vites değiştirme hakkında konuşmaya başlıyor.


4
Görünüşe göre bugünlerde birçok comp bilimi dersi Java kullanıyor ve bu da bahsettiğiniz sorunu daha da kötüleştiriyor.
Dima

2
Çok iyi bir noktaya değindin. Bir ilk dil için çok karmaşık olmasının yanı sıra, C ++ çoğu zaman, iyi bir bilgisayar bilimi dersi için kritik olan işletim sistemi ve bellek ile düşük seviyeli etkileşimi gizlemeyi teşvik eder. Diziler nesnelerden çok önce öğretilmelidir.
Matt Joiner

1
Öte yandan, matematikte kötü değilseniz, işlevsel programlama daha doğal olabilir çünkü daha tanıdık görünür ve hisseder ve çalışır.
Sebastian Mach

2
"Comp bilimi derslerinin hala C kullanmasının bir nedeni var." Evet, çünkü çoğu bilgisayar bilimi dersi kötü öğretiliyor.
Orbit'te Hafiflik Yarışları

8

Hayır.

Eiffel veya C # gibi en modern OO tabanlı dillere daha yakın olduğu için C ++ öğrenmek genellikle daha kullanışlıdır.

Amacınız C ++ öğrenmekse, ilk etapta modern, standart C ++ öğrenin. Mallocları bir kenara bırakın.


Ama Steve Rowe'un bir anlamı var ...


Günümüzde C ++, C # veya Eifel gibi OO dillerine yakın değildir.
einpoklum

7

İlk önce Java öğrenmiş olan kişilerin C ++ 'da işaretçiler ve bellek yönetimi kavramlarıyla mücadele ettiğini gözlemledikten sonra, diğer C ++' nın karmaşıklığından izole edilmiş bu iki kavramı kavramak için önce C öğrenmenin iyi bir fikir olduğunu söyleyebilirim. özellikleri.


6

Benim görüşüm:

Önce C öğrenmeyi öneririm çünkü:

  • o temel bir dildir - C'den gelen birçok dil
  • C ++ 'dan daha fazla platform C derleyicisini destekler - gömülü sistemler, GPU yongaları vb.
  • TIOBE indeksine göre C, hala C ++ 'dan yaklaşık 2 kat daha popüler.

3

bence c gerçekten güzel bir programlama dili, kompakt ve öğrenmesi biraz kolay. ama sadece c ++ öğrenmek istiyorsanız c ++ ile başlayın. ama ikisini de öğrenmenizi öneririm. ve eğer bunu yapmak istiyorsanız; c ile başlamak daha iyidir. daha önce de söylendiği gibi: küçük ve öğrenmesi biraz kolay. c ++ gibi daha karmaşık bir programlama diline doğru güzel bir adım olabilir. (c size bazı temel bilgiler sağladığı için)

iyi şanslar.

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.