C ++ kodunda C ifadeleri kullanmak iyi bir alışkanlık mıdır?


19

Okulda bu yıl C'yi öğrenmeye başladık, sınıfın çok ilerisindeyim ve sınıf C'nin temelindeyken Java, C ++ ve C öğrendim. Her neyse, kendimi belgeliyorum, kitap okuyorum, ve öğretmenime neden C öğrenmem gerektiğini sordum ve bunun C ++ 'ın temeli olduğunu söyledi. Programlamaya ilk başladığımda C ++ 'ı çok daha kolay buldum, daha sonra öğrendim C. Ama kitaplarda C kodunun C ++' da çalıştığını görebiliyorsunuz, tersi değil.

Benim sorum oldukça basit ~ C ++ C ifadeleri kullanmak iyi bir alışkanlık mı? Sana bir örnek vereyim:

Bu kod olmalı

#include <stdio.h>
#include <iostream>

int main() {
int x;
scanf("%d", &x);
cout << "The number you entered is " << x << "And it's double is " << x*x;
return 0;
}

Bundan daha verimli veya daha iyi olun:

#include <iostream>

int main() {
int x;
cin >> x;
cout << "The number you entered is " << x << "And it's double is " << x*x;
return 0;
}

Bazı tozlu eski kitaplarda bu konuda bazı kolay belgeler yaptım ve bulabildiğim kadarıyla cout yerine scanf kullanmak da akışı veya bunun gibi bir şeyi temizliyor, bu yüzden temelde scanf ve in kullanmanın daha iyi olup olmadığını soruyorum ne bağlam.

Bu aynı zamanda dosya IO için de geçerlidir çünkü her zaman FLE IO'nun C ++ 'da olduğundan daha kolay olduğunu gördüm. Bu soru, C ++ 'da uygulanan C'deki hemen hemen her genel ifade için geçerlidir. Ayrıca modern bir derleyici kullanıyorum ve yine de bu C ++ kodunda C ifadeleri kullanmak için iyi bir programlama alışkanlığı olup olmadığını soruyorum gibi önemli olmamalıdır.

Muhtemelen bunu yapmanın eksileri ve artıları var, ama sadece evet / neden, hayır / neden cevap arıyorum.

Ayrıca dışarıda bıraktığım herhangi bir detay varsa yorum yaz.


12
Karıştırma konusunda çok dikkatli olun stdiove iostream. Bir aile içinde, dışında mutlaka uygulanması gerekmeyen belirli bir düzen ve senkronizasyon vardır.
David Thornley

Bahşiş için teşekkürler, ancak bu kod hurdası saf bir örnekti. Yine de teşekkürler.
Bugster

25
Programlama öğreniyorsanız; Sen doğru girinti öğrenmek gerekir!
bitmask

5
scanf () harika bir örnek değildir; C ya da C ++ 'dan kaçınmanızı tavsiye ederim o kadar korkunç hata eğilimli.
Russell Borogove

1
Sadece örnek kod olabilirdi ama David'in açıklama gerçekten neden konunun kalbine alır değil C ++ programlama yaparken C deyimleri kullanın. Tamamen farklı dillerdir; Java ve C veya C ++ ve Visual Basic karıştırmak daha onları karıştırmayın.
Cody Gray

Yanıtlar:


36

Hayır, bu kötü bir alışkanlık. Bunu yaşamak için yaptığınızda, muhtemelen ekibinizin yapıştığı stil kılavuzlarını ihlal edersiniz (veya en azından kod incelemeleri sırasında aşınırsınız).

Evet çalışıyor, ancak bir c ++ eşdeğeri varsa kullanın. (örneğin karıştırmak için değil denemek printfsile couts)


+1 - Kısa ve öz. Bu da cevabımdaki ana noktayı vurgulayarak takım kılavuzlarının insanları bir araya getirmelerine ve birlikte çalışabilmeleri için birleştirmelerine yardımcı oluyor.
jmort253

Bu yorum sorumu hemen hemen düzgün bir şekilde cevaplıyor ve sağlam bir tartışma getiriyor. Teşekkür ederim.
Bugster

1
@ThePlan teşekkürler. herkesin bu soruya büyük cevapları vardı.
jglouie

1
Not: printfTutarlı kullanmak, tutarlı kullanmak kadar iyi çalışır cout. Tek problem onları bir araya getirmek ve stil.
user253751

C'de C ++ eşdeğeri olmayan bir özellik örneği verebilir misiniz?
Klutt

20

Genel olarak, C ve C ++ sanki tamamen ayrı iki dilmiş gibi ele alınır. Bu nedenle, bir C ++ programında C sözdiziminin kullanılması kötü form olarak kabul edilebilir.

Haklısın; ancak, bu C kodu gayet iyi derlenecektir. Bu gerçekten aşağıdaki standartlar açısından şirketinizin ne kadar esnek olduğuna bağlıdır. Eğer bir röportajda soruyu sormuş olsaydım, görüşmeci C'nin C ++ 'da çalıştığını bilmesini isterdim, ama aynı zamanda C ve C ++' ın iki ayrı dil olduğunu ve çok, bunun için iyi bir sebep.

Dikkate alınması gereken başka bir şey, standartların daha fazla insanın kodla kolayca çalışabileceği bir platform oluşturmasına yardımcı olmasıdır. Sizi C öğrenmeye teşvik eden bir öğretmeniniz olduğu için şanslı olsanız da, herkes o kadar şanslı olmayabilir. Bu nedenle, bir C ++ programında C'yi karıştırmak, C'yi hiç öğrenmemiş biri için kafa karıştırıcı olabilir.

Özetle, bir şey yapabilmeniz, yapmanız gerektiği anlamına gelmez ve sadece bir şey yapmamanız, yapamayacağınız anlamına gelmez :)


Anlıyorum. İşlevselliğe ne dersiniz, C sözdiziminin C ++ sözdiziminden daha iyi olduğu belirli durumlar var mı?
Bugster

10

C ++ tasarımla C ile geriye doğru uyumludur, bu nedenle genellikle C kodu C ++ derleyicisi tarafından derlenecektir (gayet iyi ( genellikle C ++ 'da C olmayan ve derlemeyi bozan C kodunda kullanılabilen ek ayrılmış sözcükler olduğu için).

Ancak, ben kod karıştırma kötü uygulama olarak görüyorum. Kullanıyorsanız scanf- kullanın printf, kullanıyorsanız operator >>- kullanınoperator << . Aşırı yüklenmiş C ++ operatörlerinin farkında olmadığınız işlevleri kapsülleyebilmesinin nedeni ve bunların eşleşmemesi programınızın yapmasını istemediğiniz şeyler yapmasına neden olur.

C ++ kodunda C sözdizimini tercih etmenin özel bir nedeni yoktur, bunlar farklı dillerdir ve C ++ kodunda C sözdizimi kullanırken - hala güçlü araçlarının çoğunu kullanmadan C ++ kodu yazıyorsunuz .


5
C ve C ++ arasındaki uyumsuzluk sadece anahtar kelimelerden daha fazlasıdır. Yazma sistemi değişir ve C ++ 'da olmayan (özellikle C99) özellikler vardır. (Örneğin, değişken uzunluklu diziler).
Arafangion

9

Kodlama stilini ve estetik sorunları bir kenara bırakırsak, C ++ kodunda C kullanırken karşılaştığınız çeşitli teknik sorunlar da vardır:

  • C nedir? C90, C99 veya C11? Hangi C standardını kullandığınıza bağlı olarak çeşitli uyumluluk sorunları olabilir. Boole türü, // yorumlar, VLA'lar, belirlenmiş başlatıcılar vb.Gibi C99 özellikleri.

  • C ++, C'den daha sıkı yazmaya sahiptir. C ++ 'da C kodu derlemek için, büyük olasılıkla beklenen türü elde etmek için çeşitli daktilolar eklemeniz gerekir. Bu, C ++ 'da çalışmasını sağlamak için mükemmel, üretim kalitesinde C kodunu yeniden yazmanız gerekebileceği anlamına gelir.

  • Daha katı yazarak uygulanan daktilolar genellikle sadece iyi bir şeydir, ancak bazı durumlarda hataları tanıtabilir veya gizleyebilirler. Sonucun kötü şöhretli dökümünü örnek olarak malloc () 'dan alın. Bu C ++ ile yazılmalıdır, ancak asla C ile yazılmamalıdır. (1)

  • C ve C ++ işlevlerinin karıştırılması hatalara ve tanımlanmamış davranışlara yol açabilir. Örneğin, malloc () ile ayırmak ve delete ile serbest bırakmak işe yaramaz . (2)

  • İplik güvenlik sorunları. C standart kitaplığı iş parçacığı için güvenli değildir. Standart C ++ kitaplığı iş parçacığı için güvenli olabilir veya olmayabilir, kodunuza C kitaplığı işlev çağrıları eklemek bunu yok edecektir.

    Windows programcıları için bir sidenote olarak: Windows API CreateThread () işlevi C kitaplığıyla aynı programda kullanıldığında, Visual C ++ derleyicisinin bir süre sızıntı hatası vardı. (3, 4)

  • Çağırma kuralı, bazı derleyicilerde, extern "C""C çağrı kuralı" ile hangi işlevlerin bağlantılı olması gerektiğini açıkça belirtmek için kullanmaya zorlanan bir sorun olabilir .

  • Can sıkıcı ayrıntılar. Virgül operatörü farklı davranır. Struct / enum bildirimlerinde sondaki virgüllere C99 / C11'de izin verilir, ancak C ++ kullanılamaz. Çeşitli değişken ve fonksiyonların kapsamı farklı şekilde ele alınır. Vs vs.

Muhtemelen daha da fazla vaka var.


Referanslar:

  1. http://c-faq.com/malloc/cast.html
  2. http://www.parashift.com/c++-faq-lite/freestore-mgmt.html#faq-16.3
  3. http://www.flounder.com/badprogram.htm#CreateThread
  4. http://msdn.microsoft.com/en-us/library/windows/desktop/ms682453%28v=vs.85%29.aspx

7

C ++ 'ın C derlemesinin nedeni yalnızca "geriye dönük uyumluluk" içindir (mevcut çalışma kodunu yeniden yazmaktan kaçının).

Ancak C ++ 'nın c'ye karşı farklı bir felsefe saygısı vardır. Bunları karıştırmak her ikisine de iyi bir hizmet vermez.

C ve C ++ 'ın i / o'yu yönetme şekli, i / o dahili durumunu yönetmek için farklı bir yola güvenebilir. Yani -en azından- giriş ve çıkışı tutarlı kullanın.

Ve C ++ programlarında C ++ stiline saygı duyulur (özellikle başka bir yerde yapılması gerekmedikçe)


5

Önce C öğrenmenin, IMHO, iyi bir fikir olduğunu söyleyebilirim. Bu şekilde insanlar yazılımı yazdıkları donanımı anlamaya başlarlar.

Bu iki dili karıştırmak iyi bir fikir değildir. Çünkü C ++ 'nın deli karmaşıklığını C ile ortak ham bit twling ile birleştiriyorsunuz.

Gördüğünüz gibi, sizinki gibi basit bir örnekte bile, farklı akış türleri ve dahili arabelleğe alma ile bir senkronizasyon sorunu var. Ama aynı zamanda, C & C ++ yaklaşımı hiçbir şekilde daha esnek değildir. Sınıf x'e geçin ve akış ve diğer şeyleri kullanacak operatör yoktur.

Karmaşık...

Gerçekten iyi C ++ programcı bit her yapı arkasında nasıl çevrilir ve gizli davranışlar neler olduğunu bilmek gerektiğini düşünüyorum.

Ancak, en az% 50'sinden fazla olan C ++ öğrenmek, 5 yıldan fazla profesyonel kodlama gerektirir ve bunu 6 ay süren müfredatta 20 ya da daha fazla deneyim içeren uygulamayla yönetemezsiniz.

Eğer C ++ yapılarını kullanacak olursam, akışları kullanmazdım, kuş bakışı görünümden basittirler ve insanların yazılım geliştirmenin kolay olduğuna inanmasını sağlarlar, ancak birçok durumda çok fazla fayda olmadan ekstra karmaşıklıkları gizlerler.

RAII sarıcı sınıfları, şablonlar, aşırı yükler, sabit doğruluk ve ortak arabirimler için saf soyut sınıflar (lütfen burada F-ng Java yolunu kullanmayın LÜTFEN!) İyi adaylardır. Çünkü gerçek hayat projeleri için çok önemli olan güvenlik, genellik ve kullanım kolaylığını ekliyorlar. Yine de, sanal imha, varsayılan kopya yapısının patlayıcı niteliği, çalışma zamanı yükü, sabit doğruluk vb. Gibi şeyleri hatırladığınızdan emin olun.

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.