2008-09-28 10 views
43

मैं सी ++ प्रोग्रामिंग में एक कक्षा ले रहा हूं और प्रोफेसर ने हमें बताया कि सी सीखने की कोई आवश्यकता नहीं है क्योंकि सी ++ में सी प्लस ऑब्जेक्ट-ओरिएंटेड फीचर्स में सबकुछ शामिल है। हालांकि, कुछ अन्य ने मुझे बताया है कि यह जरूरी नहीं है। क्या कोई इस पर रोशनी डाल सकता है?क्या यह सच है कि सी सीखने की कोई आवश्यकता नहीं है क्योंकि सी ++ में सब कुछ शामिल है?

+0

ऐसे सभी उपयोगी उत्तरों के लिए धन्यवाद! – user23126

+4

अपने प्रोफेसर की रक्षा में, बहुत विशिष्ट होने पर शिक्षण को सबसे अधिक समझना कठिन होगा, और महत्वपूर्ण बातों पर ध्यान केंद्रित करना महत्वपूर्ण होगा। इसलिए वह शायद सख्त सुपरसैट नहीं होने के बारे में जानता है। –

+0

संभावित डुप्लिकेट [क्या मुझे सी ++ सीखने से पहले सी सीखना चाहिए?] (Http://stackoverflow.com/questions/598552/should-i-learn-c-before-learning-c) – RiaD

उत्तर

81

अवलोकन:

यह लगभग सच है कि सी ++ सी का सुपरसेट है, और अपने प्रोफेसर सी अलग से जानने के लिए कोई जरूरत नहीं है कि में सही है।

सी ++ पूरे ऑब्जेक्ट उन्मुख पहलू, जेनेरिक प्रोग्रामिंग पहलू के साथ-साथ कम सख्त नियम भी जोड़ता है (जैसे प्रत्येक फ़ंक्शन के शीर्ष पर घोषित करने की आवश्यकता वाले चर)। सी ++ सी में कुछ शर्तों की परिभाषा को बदलता है जैसे कि structs, हालांकि अभी भी सुपरसैट तरीके से।

कारण है कि यह एक सख्त superset नहीं है के उदाहरण:

एक आमतौर पर का सामना करना पड़ा अंतर कि सी से अंतर्निहित रूपांतरण की अनुमति देता है:

This Wikipedia article इस तरह के एक मतभेद के एक जोड़े अच्छा उदाहरण है शून्य * अन्य सूचक प्रकारों के लिए, लेकिन सी ++ नहीं है। तो, निम्नलिखित मान्य सी कोड है:

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

... लेकिन यह दोनों सी और सी में काम करने के लिए ++ एक एक स्पष्ट कलाकारों का उपयोग करने की आवश्यकता होगी:

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

एक अन्य आम पोर्टेबिलिटी इश्यू है कि सी ++ कई नए कीवर्ड, जैसे नए और क्लास को परिभाषित करता है, जो हो सकता है जो एक सी प्रोग्राम में पहचानकर्ता (उदाहरण के लिए नाम) के रूप में उपयोग किया जाता है।

This wikipedia article रूप में अच्छी तरह आगे मतभेद है:

सी ++ compilers एक प्रारंभ पार करने से गोटो निषेध, निम्नलिखित C99 कोड में के रूप में:

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

आप पहली बार क्या सीखना चाहिए ?

आपको पहले सी ++ सीखना चाहिए, क्योंकि सी सीखना आपको पहले चोट पहुंचाएगा, न कि आपको कुछ भी अनदेखा करना होगा (आप नहीं करेंगे), लेकिन क्योंकि पहले सी सीखने में कोई फायदा नहीं है। अंततः आप सी के बारे में सब कुछ सीखेंगे क्योंकि यह सी ++ में कम या ज्यादा निहित है।

+23

मुझे लगता है कि आपको/होगा/करना होगा अगर आप सी से शुरू करते हैं तो अनजान चीजें हैं। कई स्वीकार्य सी मुहावरे हैं जो सी ++ में खराब अभ्यास हैं। प्रीप्रोसेसर दुरुपयोग, आदिम पॉइंटर्स का अनावश्यक उपयोग, संरचना अर्थशास्त्र, लेकिन कुछ उदाहरण हैं जो ध्यान में आते हैं। – wilhelmtell

+5

... और "पुराने" आप हैं, इन आदतों से छुटकारा पाने के लिए कठिन है। – wilhelmtell

+0

मेरा मानना ​​है कि प्रकार के कास्टिंग मुद्दे (शून्य *) को अधिकांश प्लेटफार्मों पर कंपाइलर विकल्पों के साथ हल किया जा सकता है। –

3

यह सच है कि अधिकांश उद्देश्यों के लिए, सी ++ में सी सब कुछ होता है जो सी करता है। भाषा वकील यह इंगित करने के लिए जल्दी होंगे कि कुछ बहुत ही खास किनारे के मामले हैं जो वैध सी हैं लेकिन मान्य सी ++ नहीं हैं।इस तरह के

एक उदाहरण सी घोषणा

int virtual; 

जो एक पूर्णांक "आभासी" नाम की घोषणा हो सकती है। चूंकि "आभासी" सी ++ में एक कीवर्ड है, यह वैध सी ++ मान्य नहीं है।

2

मैं व्यक्तिगत रूप से आपके प्रोफेसर से असहमत हूं।

आम तौर पर, सी ++ सी पर आधारित है और उस "भावना" में यह शामिल है और इसे विस्तारित करता है।

हालांकि, परंपरागत रूप से लोगों ने सी सी और केवल तब सी सी + के विस्तार सीखा, इसलिए आपके प्रोफेसर का कथन सही है क्योंकि सी ++ का सही उपयोग करने के लिए आपको सी उत्पत्ति को मास्टर करने की आवश्यकता होगी। यह संभव है कि आपको कुछ सिखाते समय, आपके प्रोफेसर या पाठ्यपुस्तक में विशेष रूप से उल्लेख नहीं किया जाएगा कि कौन सी भाषा से आया था।

इसके अलावा, यह समझना महत्वपूर्ण है कि समानता के बावजूद, प्रत्येक सी प्रोग्राम सी ++ के तहत समान तरीके से चलता नहीं है। उदाहरण के लिए, सी स्ट्रक्चर को सी ++ कंपाइलर द्वारा अलग-अलग (सार्वजनिक रूप से सब कुछ के साथ कक्षाओं) के रूप में व्याख्या किया जाता है।

जब मैं सिखाता हूं, तो मैं पहले सी कोर पढ़ता हूं, और फिर सी ++ पर जाता हूं।

+1

"सी structs का अलग-अलग अर्थ है"? जहां तक ​​मैं देख सकता हूं, सी ++ में "सबकुछ सार्वजनिक रूप से कक्षाएं" सी में समान रूप से काम करती हैं, जब तक कि आप कोई भी C++ - विशिष्ट कार्य जैसे सदस्य कार्य नहीं जोड़ते हैं। इसलिए सी ++ के रूप में संकलित होने पर structs के साथ एक सी प्रोग्राम बिल्कुल वही काम करता है। या मैं गलत हूँ? –

+1

शुद्ध दृष्टिकोण से, जब आप सी ++ में एक संरचना संकलित करते हैं, तो यह डिफ़ॉल्ट कन्स्ट्रक्टर और कॉपी कन्स्ट्रक्टर सहित कक्षा उत्पन्न करता है। यह एक उन्नत ओओपी पाठ्यक्रम में एक प्रश्न था जो मैंने कई साल पहले लिया था और फिर कुछ सालों तक पढ़ाया जाता था। – Uri

+0

"... सी ++ का सही उपयोग करने के लिए आपको सी उत्पत्ति को मास्टर करने की आवश्यकता होगी ..." मैं कहूंगा कि यह बेहद गलत है। मुझे लगता है कि _ सही ढंग से सी ++ का उपयोग करने के लिए आपको अपनी सभी सी आदतों को भूलना होगा। यह बहुत कठिन है, यही कारण है कि मैं _very_ दृढ़ता से इस पीओवी का विरोध करता हूं। – sbi

4

नहीं सी ++ वास्तव में सी के एक सुपरसेट नहीं है अगर आप रुचि रखते हैं आप मतभेद की एक अधिक व्यापक सूची के लिए इस लेख की जाँच कर सकते हैं: http://en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B

+1

और सी 1 एक्स और सी ++ 1 एक्स मानकों तक पहुंचने के साथ और अधिक अनुकूलताएं होंगी। हालांकि समितियां संगतता के लिए प्रयास करती हैं, फिर भी ऐसी विशेषताएं हैं जो दोनों भाषाओं (ड्राफ्ट के अनुसार) में नहीं होंगी। – Kensai

11

हालांकि यह सच है कि सी ++ एक बनाए रखने के लिए डिजाइन किया गया था है सी के साथ संगतता की बड़ी डिग्री और सी ++ में जो भी आप सीखते हैं उसका एक सबसेट सी पर लागू होगा मानसिकता पूरी तरह से अलग है। बूस्ट या एसटीएल के साथ प्रोग्रामिंग सी ++ सी

बेहतर सी के रूप में सी ++ का उपयोग करने वाली कला का एक शब्द था। इसका अर्थ सी प्रोग्रामिंग को आसान बनाने के लिए कुछ सी ++ भाषा सुविधाओं और उपकरणों का उपयोग करना था (उदाहरण के लिए , कथन के भीतर लूप के इंडेक्स वैरिएबल की घोषणा)। लेकिन अब, आधुनिक सी ++ विकास सिंटैक्स के एक बड़े सौदे के अलावा सी से बहुत अलग लगता है और उन मामलों में सी विरासत अक्सर लाभ के बजाय बोझ लगती है।

3

सी (विशेष रूप से सी 8 9) और सी ++ का एक बड़ा आम कोर है, लेकिन सी और सी ++ के बीच निश्चित रूप से अंतर के क्षेत्र हैं। जाहिर है, सी ++ में सभी ऑब्जेक्ट-ओरिएंटेड फीचर्स हैं, साथ ही जेनेरिक प्रोग्रामिंग, प्लस अपवाद, प्लस नेमस्पेस जो सी नहीं करता है। हालांकि, सी की विशेषताएं भी हैं जो सी ++ में नहीं हैं, जैसे कार्यों को घोषित करने और परिभाषित करने के लिए गैर-प्रोटोटाइप नोटेशन (पुरातन के करीब) के लिए समर्थन। विशेष रूप से, निम्नलिखित समारोह घोषणा का अर्थ सी और सी में अलग है ++:

extern void function(); 

सी ++ में, कि एक समारोह है कि कोई मान देता है और इसलिए कोई पैरामीटर लेता है (और, है, अपने पक्ष के लिए पूरी तरह कहा जाता है प्रभाव, जो भी वे हैं)। सी में, यह एक ऐसा फ़ंक्शन है जो कोई मूल्य नहीं देता है, जिसके लिए तर्क सूची के बारे में कोई जानकारी नहीं है। सी को फ़ंक्शन को कॉल करने से पहले दायरे में एक घोषणा की आवश्यकता नहीं होती है (सामान्य रूप से; यदि कार्य में तर्कों की परिवर्तनीय सूची होती है तो आपके पास दायरे में एक घोषणा होनी चाहिए, इसलिए printf(), आदि का उपयोग करने से पहले #include <stdio.h> पर महत्वपूर्ण है)।

वहाँ भी अंतर हैं:

sizeof('c') 

सी ++ में, इस सवाल का जवाब 1 है, सी में, उत्तर सामान्य रूप से 4 (8-बिट वर्ण वाले 32-बिट सिस्टम) या यहां तक ​​कि 8 (64-बिट int के साथ 64-बिट सिस्टम) है।मेरी कोड के बहुमत है कि हर समय है -

सामान्य तौर पर, आप कोड है कि दोनों C और C++ compilers के तहत अधिक कठिनाई के बिना संकलन होगा लिख ​​सकते हैं। अपवाद या तो मेरे हिस्से पर लापरवाही का परिणाम हैं, या क्योंकि मैंने सी 99 की अच्छी विशेषताओं का ध्यानपूर्वक उपयोग किया है जो सी ++ 98 में नहीं हैं, जैसे नामित प्रारंभकर्ता, या long long

4

Not entirely true.

सबसे बड़ी "पकड़ लिया" टाइप कर रहा है - सी ++ और अधिक दृढ़ता से लिखा गया से सी है, और ++ बस अर्थात् सी में उपलब्ध नहीं हैं सी में इस को हल करने के लिए पसंदीदा तरीकों, आप चुपचाप डाल सकता सी (विशेष रूप से सूचक प्रकार) में प्रकारों के बीच, लेकिन सी ++ में नहीं। और सी ++ अत्यधिक इन समस्याओं को हल करने के लिए static_cast/reinterpret_cast/const_cast विधियों का उपयोग करने की अनुशंसा करता है।

अधिक महत्वपूर्ण बात यह है कि यदि आप सी ++ वाक्यविन्यास और व्यवहार सीखते हैं, तो आपको शायद सी से निपटना मुश्किल लगेगा (कुछ कह सकते हैं कि यह अच्छा है; और मैं खुद को सी ++ पसंद करता हूं, लेकिन कभी-कभी यह सिर्फ एक विकल्प नहीं है, या आपको विरासत कोड से निपटना होगा जो सी में है और सी ++ नहीं है)। फिर से, सबसे अधिक संभावना मुद्दों आपके सामने आने वाली संकेत के साथ काम कर रहे हैं (विशेष रूप से चार * की और सामान्य सरणी उपयोग; C++ std :: स्ट्रिंग और std :: वेक्टर या अन्य संग्रह का उपयोग कर बस बेहतर है)।

यह निश्चित रूप से सी ++ में जानने के लिए, और उसके बाद सी और सी के बीच मतभेद ++ जानने के लिए और दोनों में प्रोग्रामिंग करने में सक्षम हो सकता है। लेकिन अंतर सिर्फ त्वचा की तुलना में कहीं अधिक हैं।

7

यह सच हो सकता है कि यदि आप सी ++ के सिंटैक्स को जानते हैं तो आपको सी के सिंटैक्स को सीखने की आवश्यकता नहीं है, लेकिन आपको सी ++ की तुलना में सी में कोडिंग प्रथाओं को अलग करने के तरीके के बारे में जानने की आवश्यकता है।

तो आपका प्रोफेसर 100% सही नहीं था।
सी में आपके पास लॉजिकल मॉड्यूल में अपना कोड व्यवस्थित करने के लिए कक्षाएं नहीं हैं और आपके पास C++ polymorphism नहीं है। फिर भी आपको अभी भी इन लक्ष्यों को हासिल करने की आवश्यकता है।
हालांकि सी की वाक्य रचना कुछ हद तक सी ++ के एक सबसेट, सी में प्रोग्रामिंग है सी में प्रोग्रामिंग के एक सबसेट नहीं है ++। यह पूरी तरह से अलग है।

5

हां और नहीं।

के रूप में दूसरों को पहले से ही उत्तर दिया है, भाषा C++ भाषा सी के एक सुपरसेट, उदाहरण के लिए, कि sizeof ('एक्स') एक अलग मूल्य देता है कुछ छोटे अपवादों के साथ।

लेकिन जो मुझे नहीं लगता वह बहुत स्पष्ट रूप से कहा गया है कि जब की बात आती है तो इन दो भाषाओं में का उपयोग करें, सी ++ सुपरसेट नहीं है, बल्कि अलग है। सी ++ में नया है (यदि वे बेहतर हैं तो चर्चा की जा सकती है) मूल बातें करने के तरीके, जैसे कि स्क्रीन पर लिखना। पुराने सी तरीके अभी भी वहां हैं, लेकिन आप आम तौर पर नए तरीकों का उपयोग करते हैं। इसका मतलब है कि एक सरल "हैलो वर्ल्ड" प्रोग्राम सी और सी ++ में अलग दिखता है। तो यह वास्तव में सच नहीं है कि सरल चीजें सी और सी ++ में समान होती हैं, और फिर आप सी ++ में ऑब्जेक्ट उन्मुख प्रोग्रामिंग के लिए समर्थन जैसे अधिक उन्नत सामान जोड़ते हैं।

तो यदि आपने सी ++ सीखा है, तो आपको सी में प्रोग्राम करने से पहले बहुत कुछ सीखना होगा। (ठीक है, सी ++ को सी के विस्तार के रूप में पढ़ाना संभव है, अभी भी printf और malloc का उपयोग करना iostreams और नया, और फिर कक्षाएं और अन्य C++ चीजें जोड़ना, लेकिन सी ++ का उपयोग करने का यह तरीका आम तौर पर फहरा हुआ है।)

0

यदि कक्षा में से कोई भी छात्र एम्बेडेड सॉफ़्टवेयर इंजीनियरों बनने का इरादा रखता है, तो उनके पास सी में प्रोग्राम करने के लिए कोई विकल्प नहीं हो सकता है (this question, और this one देखें)।

बेशक, सी ++ सीखा है, यह स्क्रैच से शुरू करने से उनके लिए एक संक्रमण का कम हो सकता है - लेकिन यह अभी भी आपके प्रोफेसर के बयान को असत्य बनाता है!

+0

चीजें बदलती प्रतीत होती हैं। http://www.embedded.com/212101526 – Kensai

+0

हां - लेकिन इस मामले में धीरे-धीरे। फिर भी, सभी एम्बेडेड प्रोसेसर में सी ++ कंपाइलर्स नहीं होते हैं, जो अक्सर सी ++ विकल्प के लिए अधिक शुल्क लेते हैं, और मौजूदा कोड का बहुमत अभी भी सी में लिखा गया है। इसलिए मैं अपने जवाब से खड़ा हूं! –

3

स्ट्राउस्ट्रप स्वयं advices against सीखने सी पहले। लेकिन फिर, वह (और उनकी पीढ़ी के कई अन्य) सी ++ गुरु से शुरू होने में सी ++ गुरु बनने में कामयाब रहे।

+2

वह यह भी बताता है कि 1 999 के पेपर में (पेज 9) क्यों। http://www.research.att.com/~bs/new_learning.pdf – Kensai

संबंधित मुद्दे