सवाल क्या यह सच है कि सी सीखने की कोई आवश्यकता नहीं है क्योंकि सी ++ में सबकुछ है? [बन्द है]


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


44
2017-09-28 03:08


मूल


ऐसे उपयोगी उत्तरों के लिए सभी को धन्यवाद! - user23126
अपने प्रोफेसर की रक्षा में, बहुत विशिष्ट होने पर शिक्षण को सबसे अधिक समझना मुश्किल होगा, और महत्वपूर्ण बातों पर ध्यान केंद्रित करना महत्वपूर्ण है। इसलिए वह शायद सख्त सुपरसैट नहीं होने के बारे में जानता है। - Brian R. Bondy
के संभावित डुप्लिकेट क्या मुझे सी ++ सीखने से पहले सी सीखना चाहिए? - RiaD


जवाब:


अवलोकन:

यह लगभग सच है कि सी ++ सी का एक सुपरसेट है, और आपका प्रोफेसर सही है कि सी को अलग से सीखने की आवश्यकता नहीं है।

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

उदाहरण के लिए यह सख्त सुपरसैट क्यों नहीं है:

यह विकिपीडिया लेख इस तरह के मतभेदों के कुछ अच्छे उदाहरण हैं:

एक आम तौर पर सामना करना अंतर है   कि सी से अंतर्निहित रूपांतरण की अनुमति देता है   शून्य * अन्य सूचक प्रकारों के लिए, लेकिन सी ++   नहीं करता। तो, निम्नलिखित मान्य सी है   कोड:

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

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

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

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

यह विकिपीडिया लेख इसमें और अंतर भी हैं:

सी ++ कंपाइलर्स प्रारंभिक क्रॉसिंग से गोटो को प्रतिबंधित करते हैं, जैसा कि निम्न C99 कोड में है:

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

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

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


81
2017-09-28 03:09



मुझे लगता है कि यदि आप सी से शुरू करते हैं तो आपको चीजों को अनदेखा करना होगा। सी स्वीकार्य सी मुहावरे हैं जो सी ++ में खराब अभ्यास हैं। प्रीप्रोसेसर दुरुपयोग, आदिम पॉइंटर्स का अनावश्यक उपयोग, संरचना अर्थशास्त्र, लेकिन कुछ उदाहरण हैं जो ध्यान में आते हैं। - wilhelmtell
... और आप "बूढ़े" हैं, इन आदतों से छुटकारा पाने के लिए मुश्किल है। - wilhelmtell
मेरा मानना ​​है कि प्रकार के कास्टिंग मुद्दे (शून्य *) को अधिकांश प्लेटफार्मों पर कंपाइलर विकल्पों के साथ हल किया जा सकता है। - Anders Sandvig
प्रीप्रोसेसर दुर्व्यवहार जैसी चीजों को कैसे करना है, इसका मतलब यह नहीं है कि इसका मतलब यह नहीं होगा कि आप इसका इस्तेमाल करेंगे। असल में आप सबसे अच्छे तरीके का उपयोग करेंगे, आपको कुछ और जानने से आपको चोट नहीं पहुंचीगी। यह आपको बाद में किसी और के कोड में इसका पता लगाने की अनुमति देगा और इसे स्वयं पुन: सक्रिय करने में सक्षम होगा। - Brian R. Bondy
आपको "महान उत्तर" के करीब पहुंचाया गया है। - Konrad Rudolph


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

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


11
2017-09-28 03:18





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

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


7
2017-09-28 05:14





हां और ना।

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

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

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


5
2017-09-28 06:20





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


4
2017-09-28 03:16



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


पूरी तरह से सच नहीं है।

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

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

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


4
2017-09-28 03:29





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

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

int virtual;

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


3
2017-09-28 03:11