Soru C ++ 'nın her şeyi içerdiği için C öğrenmeye gerek olmadığı doğru mu? [kapalı]


C ++ programında bir ders alıyorum ve profesör C'yi öğrenmeye gerek olmadığını söyledi çünkü C ++ C artı nesne yönelimli özelliklerde her şeyi içerir. Ancak, bazı diğerleri bana bunun mutlaka doğru olmadığını söylediler. Bu konuda biraz ışık tutabilir mi?


44
2017-09-28 03:08


Menşei


Bu kadar yararlı cevaplar için hepinize teşekkür ederim! - user23126
Profesörünüzün savunmasında, öğretirken çok spesifik olmak, çoğu için anlamak zorlaşır ve önemli olanın odağını kaybeder. Bu yüzden muhtemelen katı bir süperset olmanın farkında değil. - Brian R. Bondy
olası kopyası C ++ öğrenmeden önce C'yi öğrenmeli miyim? - RiaD


Cevaplar:


Genel bakış:

C ++ 'nın C'nin bir üst kümesi olduğu ve profesörünüzün C'yi ayrı olarak öğrenmeye gerek olmadığı konusunda doğru olduğu neredeyse doğrudur.

C ++ tüm nesne yönelimli yönünü, genel programlama yönünü ve daha sıkı kurallara sahip olmanın yanı sıra (her işlevin üst kısmında bildirilmesi gereken değişkenler gibi) ekler. C ++, hala süperset tarzında olmasına rağmen, C gibi bazı terimlerin tanımları yapısını değiştirir.

Sıkı bir süperset olmadığına dair örnekler:

Bu Wikipedia makalesi Böyle bir farklılığın birkaç güzel örneğine sahip:

Sık karşılaşılan bir fark   Bu C, örtük dönüşüme izin verir   void * diğer işaretçi türlerine, ancak C ++   değil. Yani, aşağıdaki geçerli C   kod:

int *i = malloc(sizeof(int) * 5);  

... ama hem C hem de   C ++ birinin açık kullanması gerekecek   oyuncular:

int *i = (int *) malloc(sizeof(int) * 5)

Bir diğer yaygın taşınabilirlik konusu   C ++, birçok yeni anahtar kelimeyi tanımlar   yeni ve sınıf gibi olabilir   tanımlayıcı olarak kullanılır (ör. değişken   C) bir programda.

Bu wikipedia makalesi başka farklılıklar da var:

C ++ derleyicileri, aşağıdaki C99 kodunda olduğu gibi, bir başlatma işlemini geçmek için goto'yu yasaklar:

 void fn(void)
 {
  goto flack;
  int i = 1;
 flack:
   ;
 }

İlk önce ne öğrenmelisin?

Önce C ++ 'yı öğrenmelisiniz, çünkü C öğrenme ilk size zarar verecek, çünkü bir şeyi öğrenmeniz gerekmeyeceği için (siz yapmayacaksınız) değil, çünkü ilk önce C öğrenme konusunda hiçbir faydası olmadığı için. Nihayet C hakkında her şeyi öğreneceksiniz, çünkü C ++ 'da az ya da çok yer almaktadır.


81
2017-09-28 03:09



Eğer C ile başlarsanız bir şeyler öğrenmeniz / istemeniz gerektiğini düşünüyorum. C ++'da Kötü Uygulama olan kabul edilebilir C deyimleri vardır. Önişlemci kötüye kullanımı, ilkel işaretçilerin gereksiz kullanımı, struct semantiği, akla gelen birkaç örnektir. - wilhelmtell
... Ve "eski" olduğunuzda, bu alışkanlıklardan kurtulmanın zorluğu. - wilhelmtell
Tip döküm probleminin (void *) çoğu platformda derleyici seçenekleri ile çözülebileceğine inanıyorum. - Anders Sandvig
Önişlemci kötüye kullanımı gibi şeyler nasıl yapılacağını bilmek, ancak bunu kullanacağınız anlamına gelmez. Temel olarak bildiğiniz en iyi yolu kullanacaksınız, ekstra bir şey bilmek sizi incitmeyecektir. Bir başkasının kodunda daha sonra onu algılamaya izin verecek ve bunu kendiniz yeniden düzenleyebileceksiniz. - Brian R. Bondy
Sizi “harika cevap” a daha yakın bir yere itti. - Konrad Rudolph


C ++ C ile büyük ölçüde uyumluluk sağlayacak şekilde tasarlandığı doğrudur ve C ++ 'da öğrendikleriniz bir alt kümesi C'ye uygulanacaktır. Zihniyet tamamen farklıdır. C + + ile Boost veya STL ile programlama C dilinde programlamadan çok farklı bir deneyimdir.

C ++ kullanarak daha iyi bir C olarak adlandırılan bir sanat eseri vardı. Bu, C programlama kolaylaştırmak için bazı C ++ dil özelliklerini ve araçlarını kullanmak anlamına geliyordu (örneğin, for ifadesinde bir for döngüsünün indeks değişkenini bildirmek). Fakat şimdi, modern C ++ gelişmesi C'den çok farklı bir sözdiziminden çok farklı görünmektedir ve bu durumlarda C mirası çoğu zaman bir faydadan ziyade bir yük gibi görünmektedir.


11
2017-09-28 03:18





C ++ sözdizimini biliyorsanız C'nin sözdizimini öğrenmeniz gerekmediği doğru olabilir, ancak C kodlama uygulamalarının C ++ 'dan farklı olarak nasıl farklı olduğunu öğrenmeniz gerekir.

Yani profesörünüz% 100 doğru değildi.
C'de kodunuzu mantıksal modüllere yerleştirecek sınıflara sahip değilsiniz ve C ++ polimorfizminiz yok. Yine de bu hedeflere bir şekilde ulaşmanız gerekiyor.
C'nin sözdizimi bir dereceye kadar C ++ bir alt kümesi olmasına rağmen programlama C, C ++ 'da programlama alt kümesi değildir. tamamen farklı.


7
2017-09-28 05:14





Evet ve hayır.

Diğerleri zaten cevaplandırdığı gibi, C ++ dil C'nin bir üst kümesidir, bazı küçük istisnalar söz konusudur, örneğin sizeof ('x') farklı bir değer verir.

Ama ne düşündüğüm çok açık bir şekilde ifade edildi. kullanım Bu iki dilden C ++, bir üst sıra değil, daha farklıdır. C ++, yeni şeyler (daha iyi olup olmadıklarını tartışabilir), ekrana yazı yazmak gibi temel şeyleri yapmanın yollarını içerir. Eski C yolları hala var, ama genellikle yeni yolları kullanıyorsunuz. Bu, basit bir "merhaba dünya" programının C ve C ++ 'da farklı göründüğü anlamına gelir. Bu yüzden C ve C ++ 'da basit şeylerin aynı olduğu ve C ++' da nesne yönelimli programlama desteği gibi daha gelişmiş şeyleri eklemeniz gerçekten doğru değildir.

Öyleyse C ++ 'yı öğrenmiş olsaydınız, C'yi programlayabilmeniz için bir çok şeyi tekrar öğrenmeniz gerekir. (C, C ++' yu bir uzantı olarak öğretmek, yine de iostreams ve new yerine printf ve malloc kullanmak mümkündür. ve sonra sınıflar ve diğer C ++ şeyleri ekleyerek, ancak C ++ kullanmanın bu yolu genellikle kaşlarını çattıracaktır.)


5
2017-09-28 06:20





C ++, gerçekten C'nin bir üst kümesi değildir. İlgilendiğinizde, farklılıkların daha kapsamlı bir listesi için bu makaleyi inceleyebilirsiniz: http://en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B


4
2017-09-28 03:16



C1x ve C ++ 1x standartlarına yaklaştıkça daha fazla uyumluluk olacaktır. Komiteler uyumluluk için çabalasalar da, her iki dilde de olmayacak (zaten taslaklara göre) özellikler zaten var. - Kensai


Tamamen doğru değil.

En büyük "gotcha" yazıyor - C ++, C'den çok daha güçlü bir şekilde yazılıyor ve C ++ 'da bunu çözmek için tercih edilen yöntemler basitçe C dilinde mevcut değil. Yani, C (özellikle işaretçi türleri) türleri arasında sessizce yayınlayabilirsiniz. ama C ++ değil. Ve C ++ büyük ölçüde Bu sorunları çözmek için static_cast / reinterpret_cast / const_cast yöntemlerini kullanmanızı önerir.

Daha da önemlisi, C ++ sözdizimi ve tutumlarını öğrenirseniz, muhtemelen C ile uğraşmayı zor bulursunuz (bazıları bunun iyi olduğunu söyleyebilir ve C ++'yı tercih ederim, fakat bazen sadece bir seçenek değil) C ve C ++ olmayan eski kodlarla ilgilenin. Yine, karşılaşacağınız en olası konular işaretçilerle (özellikle char * 'lar ve genel dizi kullanımıyla; C ++'da std :: string ve std :: vector ya da diğer koleksiyonlarla ilgileniyor. daha iyi).

C ++ 'yı öğrenmek ve C ve C ++ arasındaki farkları öğrenmek ve her ikisinde de programlama yeteneğine sahip olmak kesinlikle mümkündür. Fakat farklılıklar sadece derinden çok daha fazlası.


4
2017-09-28 03:29





Çoğu amaç için C ++'nun C'nin yaptığı her şeyi içerdiği doğrudur. Dil avukatları, geçerli C fakat geçerli C ++ olmayan bazı çok özel durumların bulunduğuna dikkat çekeceklerdir.

Böyle bir örnek C bildirgesi olabilir.

int virtual;

"sanal" adlı bir tamsayı bildirir. "Sanal", C ++ 'da bir anahtar kelime olduğundan, bu geçerli C ++ değildir.


3
2017-09-28 03:11