क्या C ++ कोड में C के भाव का उपयोग करना एक अच्छी आदत है?


19

स्कूल में हमने इस वर्ष सी सीखना शुरू कर दिया, इस तथ्य के बावजूद कि मैं कक्षा से आगे हूं, और मैंने जावा, सी ++ और सी सीखा, जबकि क्लास सी। किसी भी तरह से है, मैं खुद को दस्तावेज कर रहा हूं, किताबें पढ़ रहा हूं; लेख, और मैंने अपने शिक्षक से पूछा है कि मुझे C क्यों सीखना चाहिए, और उसने कहा कि यह C ++ की नींव थी। जब मैंने पहली बार प्रोग्रामिंग शुरू की तो मुझे C ++ बहुत आसान लगा, मैंने बाद में C. सीखा। लेकिन किताबों में आप देख सकते हैं कि C कोड C ++ में काम करता है फिर भी यह इसके विपरीत नहीं जाता है।

मेरा सवाल बहुत सीधा है ~ क्या C ++ में C के भाव का उपयोग करना एक अच्छी आदत है? मैं आपको एक उदाहरण देता हूं:

यह कोड होना चाहिए

#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;
}

किसी भी तरह से अधिक कुशल या बेहतर हो:

#include <iostream>

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

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

यह आईओ फाइल करने के लिए भी लागू होता है क्योंकि मैंने हमेशा सी + + की तुलना में सी में आसान होने के लिए एफआईएल आईओ पाया है। यह सवाल C ++ पर लागू C में प्रत्येक सामान्य अभिव्यक्ति के लिए बहुत अधिक है। यह भी उल्लेखनीय है कि मैं एक आधुनिक संकलक का उपयोग कर रहा हूं और फिर भी यह मायने नहीं रखना चाहिए क्योंकि मैं पूछ रहा हूं कि क्या यह C ++ कोड में C अभिव्यक्तियों का उपयोग करने के लिए एक अच्छी प्रोग्रामिंग आदत है।

ऐसा करने के लिए शायद विपक्ष और पेशेवरों हैं, लेकिन मैं केवल एक हां / क्यों, नहीं / क्यों उत्तर का प्रकार की तलाश कर रहा हूं।

इसके अलावा अगर कोई विवरण है तो मैंने एक टिप्पणी छोड़ दी है।


12
मिश्रण stdioऔर के बारे में वास्तविक सावधान रहें iostream। एक परिवार के भीतर कुछ आदेश और सिंक्रनाइज़ेशन की गारंटी है जो जरूरी नहीं कि इसके बाहर लागू हो।
डेविड थॉर्नले

टिप के लिए धन्यवाद, लेकिन यह कोड स्क्रैप एक शुद्ध उदाहरण था। फिर भी धन्यवाद।
बुगस्टर

25
यदि आप प्रोग्रामिंग सीख रहे हैं; आपको उचित इंडेंटेशन सीखना चाहिए!
bitmask

5
स्कैनफ () एक महान उदाहरण नहीं है; इसका उपयोग करने में बहुत त्रुटि है, मैं आपको C या C ++ में इससे बचने की सलाह दूंगा।
रसेल बोरोगोव

1
यह केवल नमूना कोड हो सकता है, लेकिन डेविड की टिप्पणी वास्तव में इस मुद्दे पर दिल में उतर जाती है कि आपको C ++ में प्रोग्रामिंग करते समय सी मुहावरों का उपयोग क्यों नहीं करना चाहिए । वे पूरी तरह से अलग भाषाएं हैं; जावा और सी, या सी ++ और विज़ुअल बेसिक को भ्रमित करने की तुलना में उन्हें किसी भी अधिक भ्रमित न करें।
कोडी ग्रे

जवाबों:


36

नहीं, यह एक बुरी आदत है। जब आप ऐसा किसी जीविका के लिए करते हैं, तो संभवतः आप अपनी टीम का पालन करने वाले स्टाइल गाइडों (या कम से कम कोड समीक्षाओं के दौरान अजीब हो जाते हैं) का उल्लंघन करेंगे।

हां यह काम करता है, लेकिन अगर कोई c ++ समकक्ष है, तो इसका उपयोग करें। (उदाहरण के printfsसाथ मिश्रण करने की कोशिश नहीं couts)


+1 - छोटी और बात तक। और यह मेरे जवाब में मुख्य बिंदु पर प्रकाश डालता है कि टीम दिशानिर्देश लोगों को एक साथ लाने और उन्हें एकजुट करने में मदद करते हैं ताकि वे एक साथ काम कर सकें।
jmort253

यह टिप्पणी मेरे प्रश्न का ठीक-ठीक उत्तर देती है और ठोस तर्क देती है। धन्यवाद।
बुगस्टर

1
@ ThePlan धन्यवाद। इस प्रश्न के लिए सभी के पास बहुत अच्छे उत्तर थे।
२१

1
नोट: printfलगातार उपयोग करने के साथ-साथ coutलगातार उपयोग करने से काम चलेगा । केवल समस्याएं उन्हें एक साथ मिला रही हैं, और शैली।
23:25 पर user253751

क्या आप C में ऐसी सुविधा का उदाहरण दे सकते हैं जिसमें C ++ समतुल्य न हो?
15

20

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

तुम सही हो; हालाँकि, यह सी कोड ठीक संकलित करेगा। यह वास्तव में इस बात पर निर्भर करता है कि निम्नलिखित मानकों के संदर्भ में आपकी कंपनी कितनी लचीली है। अगर मुझे कभी एक साक्षात्कार में सवाल पूछा गया था, तो मैं साक्षात्कारकर्ता को यह बताना सुनिश्चित करूंगा कि C C ++ में काम करता है, लेकिन यह भी कि C और C ++ दो अलग-अलग भाषाएं हैं और शायद तब तक मिश्रित नहीं होनी चाहिए जब तक कि बहुत, बहुत नहीं थी ऐसा करने का अच्छा कारण।

एक और बात पर विचार करना है कि मानक एक मंच बनाने में मदद करते हैं जहां अधिक लोग आसानी से कोड के साथ काम कर सकते हैं। जब आप एक शिक्षक के लिए भाग्यशाली थे, जिसने आपको C सीखने के लिए प्रोत्साहित किया, तो हर कोई उतना भाग्यशाली नहीं हो सकता। इसलिए, C ++ प्रोग्राम में C को मिलाना किसी ऐसे व्यक्ति को भ्रमित कर सकता है जिसने कभी C नहीं सीखा था।

संक्षेप में, सिर्फ इसलिए कि आप कुछ कर सकते हैं इसका मतलब आपको नहीं करना चाहिए, और सिर्फ इसलिए कि आपको कुछ ऐसा नहीं करना चाहिए जिसका मतलब यह नहीं है कि आप नहीं कर सकते :)


समझा। कार्यक्षमता के बारे में, क्या कोई विशेष मामले हैं जब सी सिंटैक्स सी ++ सिंटैक्स से बेहतर है?
बगस्टर

10

C ++ डिजाइन द्वारा C के साथ पिछड़ा संगत है, इसलिए आमतौर पर C कोड C ++ कंपाइलर द्वारा ठीक संकलित किया जाएगा ( आमतौर पर क्योंकि C ++ में अतिरिक्त आरक्षित शब्द हैं जो C में नहीं हैं, और संकलन को तोड़ने वाले C कोड में उपयोग किया जा सकता है)।

हालाँकि, मैं इसे कोड को मिक्स करने की बुरी प्रथा के रूप में देखता हूँ। यदि आप उपयोग करते हैं scanf- उपयोग करें printf, यदि आप उपयोग कर रहे हैं operator >>- उपयोग करें operator <<। कारण यह है कि अतिभारित C ​​++ ऑपरेटर्स कार्यक्षमता को अतिक्रमण कर सकते हैं, जिनके बारे में आप जानते नहीं हैं, और उन्हें बेमेल करने से आपके प्रोग्राम को वह सामान करने का कारण होगा जो आप ऐसा नहीं करना चाहते थे।

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


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

9

अगर हम कोडिंग स्टाइल और एस्थेटिक मुद्दों को अलग रखते हैं, तो C ++ कोड में C का उपयोग करते समय कई तरह की तकनीकी समस्याएं भी आती हैं:

  • C क्या है? C90, C99 या C11? आपके द्वारा उपयोग किए जा रहे C मानक के आधार पर विभिन्न संगतता समस्याएं हो सकती हैं। बूलियन प्रकार, // टिप्पणियाँ, C99 सुविधाएँ जैसे VLAs, नामित इनिशियलाइज़र आदि।

  • C ++ में C की तुलना में सख्त टाइपिंग है। C ++ में C कोड संकलित करने के लिए, आपको सबसे अधिक संभावना टाइप करने के लिए विभिन्न टाइपकास्ट जोड़ना होगा। इसका मतलब है कि आपको इसे C ++ में काम करने के लिए पूरी तरह से ठीक, उत्पादन-गुणवत्ता C कोड लिखना होगा।

  • सख्त टाइपिंग से प्रभावित टाइपकास्ट आमतौर पर केवल एक अच्छी बात है, लेकिन कुछ मामलों में वे बग को दूर कर सकते हैं या छिपा सकते हैं। उदाहरण के रूप में मॉलॉक () से परिणाम के कुख्यात कलाकारों को लें। इसे C ++ में टाइपकास्ट किया जाना चाहिए, लेकिन C. (1) में कभी नहीं

  • C और C ++ कार्यक्षमता को मिलाने से कीड़े और अपरिभाषित व्यवहार हो सकते हैं। उदाहरण के लिए, यह मॉलॉक () के साथ आवंटित करने और हटाने के साथ मुक्त करने के लिए काम नहीं करेगा । (2)

  • थ्रेड सुरक्षा समस्याओं। C मानक पुस्तकालय थ्रेड सुरक्षित नहीं है। मानक C ++ लाइब्रेरी थ्रेड सुरक्षित हो सकती है या नहीं भी हो सकती है, यदि ऐसा है, तो अपने कोड में C लाइब्रेरी फ़ंक्शन कॉल जोड़ने से वह नष्ट हो जाएगी।

    विंडोज प्रोग्रामर्स के लिए एक सिडेनोट के रूप में: विजुअल C ++ कंपाइलर में कुछ समय के लिए एक लीक बग था, जब Windows API CreateThread () फ़ंक्शन का उपयोग C लाइब्रेरी के समान प्रोग्राम में किया गया था। (३, ४)

  • कॉलिंग कन्वेंशन कुछ कंपाइलरों पर एक मुद्दा हो सकता है, जो किसी extern "C"को स्पष्ट रूप से बताने के लिए उपयोग करने के लिए मजबूर करता है कि कौन से फ़ंक्शंस को "सी कॉलिंग कन्वेंशन" के साथ जोड़ा जाना चाहिए।

  • विवरण की घोषणा। कोमा संचालक अलग व्यवहार करता है। संरचना / enum घोषणाओं में अनुगामी अल्पविराम को C99 / C11 में अनुमति दी जाती है, लेकिन C ++ में नहीं। विभिन्न प्रकार के चर और कार्यों का दायरा अलग तरह से व्यवहार किया जाता है। आदि आदि।

और भी मामले होने की संभावना है।


संदर्भ:

  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 ++ को संकलित करने का कारण केवल "पिछड़ी संगतता" है (मौजूदा कामकाजी कोड को फिर से लिखने से बचें)।

लेकिन C ++ में c के लिए एक अलग दर्शन सम्मान है। इनको मिलाना दोनों के लिए अच्छी सेवा नहीं है।

C / C ++ जिस तरह से i / o को प्रबंधित करता है, वह i / o आंतरिक स्थिति को प्रबंधित करने के लिए एक अलग तरीके पर भरोसा कर सकता है। सो-कम से कम- इनपुट और आउटपुट का लगातार उपयोग करें।

और सी ++ कार्यक्रमों में सी ++ शैली का सम्मान करते हैं (जब तक कि विशेष रूप से कहीं और करने की आवश्यकता न हो)


5

मैं कहूंगा कि C सीखना सबसे पहले, IMHO, एक अच्छा विचार है। इस तरह लोग उस हार्डवेयर को समझने लगते हैं जिसके लिए वे सॉफ्टवेयर लिखते हैं।

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

जैसा कि आप देख सकते हैं, यहां तक ​​कि आपके जैसे सरल उदाहरण में, विभिन्न प्रकार की धाराओं और आंतरिक बफरिंग के साथ एक सिंक्रनाइज़ेशन समस्या है। लेकिन यह भी, C & C ++ दृष्टिकोण किसी भी तरह से अधिक लचीला नहीं है। दसवीं कक्षा में स्विच करें, और स्ट्रीमिंग और सामान का उपयोग करने के लिए कोई ऑपरेटर नहीं हैं।

यह जटिल है...

मुझे वास्तव में लगता है कि अच्छे C ++ प्रोग्रामर को पता होना चाहिए कि हर निर्माण के पीछे बिट्स कैसे फ़्लिप होते हैं, और छिपे हुए व्यवहार क्या हैं।

लेकिन C ++ सीखना, कम से कम 50% से अधिक, पेशेवर कोडिंग में 5+ वर्ष का समय लगता है, और आप इसे पाठ्यक्रम में प्रबंधित नहीं कर सकते हैं जो कि 20 महीने के अनुभव के साथ 6 महीने का लंबा या इतने घंटे का है।

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

RAII रैपर क्लासेस, टेम्प्लेट, ओवरलोड, कॉस्ट शुद्धता और कॉमन इंटरफेसेस के लिए प्योर एब्सट्रेक्ट क्लासेस (यहाँ पर f-ng Java तरीका का उपयोग न करें!) हालांकि अच्छे उम्मीदवार हैं। क्योंकि वे सुरक्षा, व्यापकता और उपयोग में आसानी को जोड़ते हैं जो वास्तविक जीवन परियोजनाओं के लिए बहुत महत्वपूर्ण हैं। आभासी विनाश, डिफ़ॉल्ट कॉपी निर्माण की विस्फोटक प्रकृति, रनवे ओवरहेड, कब्ज की शुद्धता आदि जैसी चीजों के बारे में याद रखना सुनिश्चित करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.