সি ++ কোডে সি এক্সপ্রেশন ব্যবহার করা কি ভাল অভ্যাস?


19

স্কুলে আমরা এই বছর সি শিখতে শুরু করেছিলাম, যদিও আমি ক্লাসের আগেই এগিয়ে এসেছি, এবং আমি ক্লাস সি এর বেসে থাকাকালীন জাভা, সি ++ এবং সি শিখেছি, যাইহোক, আমি নিজেই ডকুমেন্টিং করছি, বই পড়ছি, নিবন্ধগুলি, এবং আমি কেন আমার সি শিখতে হবে তা আমার শিক্ষককে জিজ্ঞাসা করেছি এবং তিনি বলেছিলেন এটি সি ++ এর ভিত্তি। আমি যখন প্রথম প্রোগ্রামিং শুরু করি তখন আমি সি ++ অনেক সহজ খুঁজে পেতাম, পরে আমি সি সি শিখেছিলাম But তবে বইগুলিতে আপনি দেখতে পাবেন যে সি কোডটি সি ++ এ কাজ করে তবে এটি বিপরীত হয় না।

আমার প্রশ্নটি বেশ সোজা ~ 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;
}

আমি ইতিমধ্যে কয়েকটি ধুলা পুরাতন বইয়ে এটি সম্পর্কে কিছু সহজ ডকুমেন্টেশন করেছি এবং আমি যা দেখতে পাচ্ছিলাম তা থেকে স্কাউট পরিবর্তে স্ক্যানফ ব্যবহার করে স্ট্রিম বা এরকম কিছু প্রবাহিত হয়েছে, তাই আমি মূলত জিজ্ঞাসা করছি এটি স্ক্যানফ ব্যবহার করা ভাল কিনা এবং কি প্রসঙ্গ।

এটি আইও ফাইলের ক্ষেত্রেও প্রযোজ্য কারণ আমি সবসময়ই ফিল আইওকে সি ++ এর চেয়ে সি-তে আরও সহজ হতে দেখেছি। এই প্রশ্নটি সিতে প্রায় প্রতিটি সাধারণ অভিব্যক্তি সি ++ এ প্রয়োগ হয়। এটিও উল্লেখযোগ্য যে আমি একটি আধুনিক সংকলক ব্যবহার করছি এবং তবুও এটির বিষয়টি বিবেচনা করা উচিত না কারণ আমি জিজ্ঞাসা করছি যে এটি সি ++ কোডে সি এক্সপ্রেশন ব্যবহার করা ভাল প্রোগ্রামিং অভ্যাস কিনা if

সম্ভবত এটি করার পক্ষে মতামত এবং পক্ষে রয়েছে, তবে আমি কেবল হ্যাঁ / কেন, না / কেন প্রকারের উত্তর খুঁজছি।

এছাড়াও যদি কোনও বিবরণ থাকে তবে আমি একটি মন্তব্য পোস্ট করে রেখেছি।


12
মিশ্রণ সম্পর্কে সত্যই যত্নবান হন stdioএবং iostream। একটি পরিবারের মধ্যে কিছু নির্দিষ্ট অর্ডার এবং সিঙ্ক্রোনাইজেশন রয়েছে যা অগত্যা তার বাইরে প্রয়োগ হয় না guaran
ডেভিড থর্নলি

টিপ দেওয়ার জন্য ধন্যবাদ, তবে সেই কোড স্ক্র্যাপটি একটি খাঁটি উদাহরণ ছিল। যাই হোক ধন্যবাদ.
বুগস্টার

25
আপনি যদি প্রোগ্রামিং শিখছেন; আপনার অবশ্যই সঠিক ইনডেন্টেশন শিখতে হবে!
বিটমাস্ক

5
স্ক্যানফ () একটি দুর্দান্ত উদাহরণ নয়; এটি ব্যবহার করতে এত মারাত্মক ত্রুটি-প্রবণ যে আমি আপনাকে সি বা সি ++ এ এড়াতে পরামর্শ দেব।
রাসেল বোরোগোভ

1
এটি কেবলমাত্র নমুনা কোড হতে পারে, তবে ডেভিডের মন্তব্যটি সত্যিই বিষয়টি কেন্দ্রীভূত করেছে যখন C ++ এ প্রোগ্রামিংয়ের সময় আপনি কেন সি আইডিয়াম ব্যবহার করবেন না । তারা সম্পূর্ণ ভিন্ন ভাষা; আপনি জাভা এবং সি, বা সি ++ এবং ভিজ্যুয়াল বেসিককে বিভ্রান্ত করার চেয়ে তাদের আর বিভ্রান্ত করবেন না।
কোডি গ্রে

উত্তর:


36

না, এটি একটি খারাপ অভ্যাস। আপনি যখন জীবনধারণের জন্য এটি করেন, আপনি সম্ভবত আপনার দল মেনে চলা স্টাইল গাইডগুলি লঙ্ঘন করবেন (বা কমপক্ষে কোড পর্যালোচনা চলাকালীন ধাক্কা খেয়ে নিন)।

হ্যাঁ এটি কাজ করে তবে একটি সি ++ সমতুল্য থাকলে এটি ব্যবহার করুন। (যেমন মিশ্রিত করা না চেষ্টা printfsসঙ্গে couts)


+1 - সংক্ষিপ্ত এবং বিন্দুতে। এবং এটি আমার উত্তরের মূল বিষয়টিকে হাইলাইট করে যে টিম নির্দেশিকা লোকদের একত্রিত করতে এবং তাদের একত্রিত করতে সহায়তা করে যাতে তারা এক সাথে কাজ করতে পারে।
jmort253

এই মন্তব্যটি বেশ আমার প্রশ্নের যথাযথ উত্তর দেয় এবং একটি শক্ত যুক্তি নিয়ে আসে। ধন্যবাদ.
বাগস্টার

1
@ প্ল্যান ধন্যবাদ এই প্রশ্নের জন্য প্রত্যেকের দুর্দান্ত উত্তর ছিল।
jglouie

1
দ্রষ্টব্য: printfধারাবাহিকভাবে ব্যবহার করা ঠিক তেমনি coutধারাবাহিকভাবে ব্যবহারের পাশাপাশি কাজ করবে । একমাত্র সমস্যাগুলি হ'ল তাদের একত্রিত করা, এবং স্টাইল।
ব্যবহারকারী 253751

আপনি কি সি এর এমন একটি বৈশিষ্ট্যটির উদাহরণ দিতে পারেন যার সি ++ সমতুল্য নেই?
klutt

20

সাধারণভাবে, সি এবং সি ++ এমনভাবে দেখা হয় যেন সেগুলি দুটি সম্পূর্ণ পৃথক ভাষা are সুতরাং, এটি একটি সি ++ প্রোগ্রামে সি সিনট্যাক্স ব্যবহার করা খারাপ ফর্ম হিসাবে বিবেচিত হতে পারে।

আপনি সঠিক; যাইহোক, যে সি কোড ঠিক জরিমানা সংকলন করবে। নিম্নলিখিত সংস্থাগুলির ক্ষেত্রে আপনার সংস্থাটি কতটা নমনীয় তা এটি নির্ভর করে। যদি আমাকে কোনও সাক্ষাত্কারে প্রশ্ন জিজ্ঞাসা করা হত তবে আমি অবশ্যই সাক্ষাতকারকে জানাতে চাই যে সি সি ++ তে কাজ করে, তবে এটিও যে সি এবং সি ++ দুটি পৃথক ভাষা এবং সম্ভবত খুব মিশ্রিত করা উচিত নয় যদি না খুব, খুব এটা করার জন্য ভাল কারণ।

আরেকটি বিষয় বিবেচনা করার বিষয় হ'ল মানকগুলি এমন একটি প্ল্যাটফর্ম তৈরি করতে সহায়তা করে যেখানে আরও বেশি লোক সহজে কোড সহ কাজ করতে পারে। আপনি ভাগ্যবান এমন একজন শিক্ষক ছিলেন যিনি আপনাকে সি শিখতে উত্সাহিত করেছিলেন, সবাই ভাগ্যবান হতে পারে না। সুতরাং, সি ++ প্রোগ্রামে সি মিশ্রিত করা এমন কাউকে বিভ্রান্ত করতে পারে যে কখনও সি শিখেনি to

সংক্ষেপে, কেবল কারণ আপনি কিছু করতে পারছেন তার অর্থ এই নয় যে আপনার উচিত হওয়া উচিত, এবং কেবল কারণ আপনার কিছু করা উচিত নয় এর অর্থ এই নয় যে আপনি পারবেন না :)


আমি দেখি. কার্যকারিতা সম্পর্কে কী, যখন সি সিনট্যাক্স সি ++ সিনট্যাক্সের চেয়ে ভাল হয় তখন কোনও বিশেষ ক্ষেত্রে থাকে?
বাগস্টার

10

সি ++ ডিজাইনের সাহায্যে সিটির সাথে পশ্চাদপটে সামঞ্জস্যপূর্ণ, তাই সাধারণত সি কোডটি সি ++ কম্পাইলার দ্বারা ঠিক সূক্ষ্মভাবে সংকলিত হয় ( সাধারণত কারণ সি ++ এ অতিরিক্ত সংরক্ষিত শব্দ রয়েছে যা সিতে নেই, এবং সংকলন ভাঙ্গা সি কোডে ব্যবহৃত হতে পারে)।

তবে, আমি এটিকে খারাপ অনুশীলন মিশ্রণ কোড হিসাবে দেখছি। আপনি যদি ব্যবহার করেন scanf- ব্যবহার করুন printf, আপনি যদি ব্যবহার করছেন operator >>- ব্যবহার করুন operator <<। ওভারলোড হওয়া সি ++ অপারেটরগুলির কার্যকারিতাটি আপনার সম্পর্কে অবগত নয় এমন কারণ হতে পারে এবং এগুলি মিল না দেওয়ার কারণে আপনার প্রোগ্রামটি এমন কাজগুলি করতে পারে যা আপনি এটি করতে চাননি।

সি ++ কোডে সি সিনট্যাক্স পছন্দ করার কোনও বিশেষ কারণ নেই, এগুলি আলাদা আলাদা ভাষা এবং সি ++ কোডে সি সিনট্যাক্স ব্যবহার করার সময় - আপনি এখনও সি ++ কোডটি লিখছেন , কেবল এর বেশিরভাগ শক্তিশালী সরঞ্জাম ব্যবহার করছেন না।


5
সি এবং সি ++ এর মধ্যে অসঙ্গতি কেবল কীওয়ার্ডের চেয়ে বেশি। টাইপিং সিস্টেমটি পরিবর্তিত হয়, এবং এমন বৈশিষ্ট্য রয়েছে যা সিতে উপস্থিত রয়েছে (বিশেষত সি 99), যা সি ++ তে বিদ্যমান নয়। (যেমন, পরিবর্তনশীল-দৈর্ঘ্যের অ্যারে)।
আরাফাঙ্গিয়ান

9

যদি আমরা কোডিং শৈলী এবং ইস্তেস্টিক সমস্যাগুলি বাদ দিয়ে থাকি, সি ++ কোডে সি ব্যবহার করার সময় আপনার বিভিন্ন প্রযুক্তিগত সমস্যার মুখোমুখি হতে পারে:

  • সি কি? সি 90, সি 99 বা সি 11? আপনি কোন সি স্ট্যান্ডার্ডটি ব্যবহার করছেন তার উপর নির্ভর করে বিভিন্ন সামঞ্জস্যতার সমস্যা থাকতে পারে। বুলিয়ান প্রকার, // মন্তব্য, ভি 99 এর মতো সি 99 বৈশিষ্ট্য, মনোনীত প্রারম্ভিক ইত্যাদি

  • সি ++ এর সি থেকে আরও কঠোর টাইপিং রয়েছে সি সি ++ এ সি কোডটি সংকলন করার জন্য, আপনাকে প্রত্যাশিত ধরণের পেতে সম্ভবত বিভিন্ন টাইপকাস্ট যুক্ত করতে হবে। এর অর্থ হ'ল সি ++ এ কাজ করার জন্য আপনাকে পুরোপুরি সূক্ষ্ম, উত্পাদন-মানের সি কোডটি আবার লিখতে হবে।

  • কঠোর টাইপিং দ্বারা প্রবর্তিত টাইপকাস্টগুলি সাধারণত একটি ভাল জিনিস তবে কিছু ক্ষেত্রে তারা বাগগুলি প্রবর্তন করতে বা লুকিয়ে রাখতে পারে। উদাহরণ হিসাবে malloc () থেকে ফলাফলের কুখ্যাত কাস্ট নিন। এটি সি ++ তে টাইপকাস্ট করা উচিত, তবে সি-তে কখনও হবে না (1)

  • সি এবং সি ++ কার্যকারিতা মিশ্রিত করার ফলে বাগ এবং অপরিজ্ঞাত আচরণ হতে পারে। উদাহরণস্বরূপ, এটি যদি malloc () এবং সঙ্গে freeing সঙ্গে বরাদ্দ করা কাজ করবে না ডিলিট । (2)

  • থ্রেড সুরক্ষার সমস্যা। সি স্ট্যান্ডার্ড লাইব্রেরি থ্রেড নিরাপদ নয়। স্ট্যান্ডার্ড সি ++ লাইব্রেরি থ্রেড নিরাপদ থাকতে পারে বা নাও থাকতে পারে, যদি তা হয়, তবে আপনার কোডে সি লাইব্রেরি ফাংশন কলগুলি যুক্ত করা ধ্বংস করবে।

    উইন্ডোজ প্রোগ্রামারদের জন্য একটি সিডেনোট হিসাবে: সি লাইব্রেরির মতো একই প্রোগ্রামে উইন্ডোজ এপিআই ক্রিয়েটথ্রেড () ফাংশনটি ব্যবহার করার সময় ভিজ্যুয়াল সি ++ কম্পাইলারের বেশ কিছু সময়ের জন্য একটি ফাঁস বাগ ছিল। (3, 4)

  • extern "C""সি কলিং কনভেনশন" এর সাথে কোন ফাংশন যুক্ত করা উচিত তা স্পষ্টভাবে বলতে বাধ্য করতে কাউকে বাধ্য করা, কিছু সংকলকগুলিতে কলিং কনভেনশন একটি সমস্যা হতে পারে ।

  • বিরক্তিকর বিবরণ। কমা অপারেটর অন্যরকম আচরণ করে। স্ট্রাক্ট / এনাম ঘোষণাপত্রের পিছনে কমাটি C99 / C11 এ অনুমোদিত তবে সি ++ নয়। বিভিন্ন ধরণের ভেরিয়েবল এবং ফাংশনগুলির সুযোগ আলাদাভাবে বিবেচনা করা হয়। ইত্যাদি ইত্যাদি

এরপরেও আরও কিছু মামলা রয়েছে।


তথ্যসূত্র:

  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

সি ++ কেন সি সঙ্কলন করতে পারে তার কারণটি কেবল "পশ্চাদপদ সামঞ্জস্য" (বিদ্যমান ওয়ার্কিং কোডটি পুনরায় লিখতে এড়ানো)।

তবে সি ++ এর গ এর প্রতি আলাদা দর্শন রয়েছে। তাদের মিশ্রণ তাদের উভয়ের পক্ষে কোনও ভাল পরিষেবা দেয় না।

যেভাবে সি এবং সি ++ পরিচালনা করে আই / ও আই ​​/ ও অভ্যন্তরীণ পরিস্থিতি পরিচালনা করার জন্য বিভিন্ন উপায়ে নির্ভর করতে পারে। তাই-সর্বনিম্ন- ধারাবাহিকভাবে ইনপুট এবং আউটপুট ব্যবহার করুন।

এবং সি ++ প্রোগ্রামগুলিতে সি ++ স্টাইলকে সম্মান করা হয় (বিশেষত অন্য কোথাও করার প্রয়োজন না হলে)


5

আমি বলব যে সি শিখতে প্রথমে, আইএমএইচও, একটি ভাল ধারণা। এইভাবে লোকেদের জন্য সফ্টওয়্যারটি লেখার জন্য হার্ডওয়্যারটি বুঝতে শুরু করে।

যদিও এই দুটি ভাষা মিশ্রিত করা ভাল ধারণা নয়। কারণ আপনি সি ++ এর উন্মাদ জটিলতাটি সি'র সাথে কাঁচা বিট টুইডলিংয়ের সাথে মিলিয়ে পেয়েছেন get

আপনি দেখতে পাচ্ছেন, আপনার মতো সাধারণ উদাহরণেও বিভিন্ন ধরণের স্ট্রিম এবং অভ্যন্তরীণ বাফার সহ একটি সিঙ্ক্রোনাইজেশন সমস্যা রয়েছে। তবে এছাড়াও, সি ও সি ++ পদ্ধতির কোনও উপায়ে আরও নমনীয় নয়। দশম শ্রেণিতে স্যুইচ করুন, এবং স্ট্রিমিং এবং স্টাফ ব্যবহার করার জন্য কোনও অপারেটর নেই।

এটা জটিল...

আমি সত্যিই মনে করি ভাল সি ++ প্রোগ্রামারকে জানা উচিত যে প্রতিটি নির্মাণের পিছনে বিট কীভাবে উল্টানো হয় এবং লুকানো আচরণগুলি কী।

তবে সি ++ শিখতে, এর কমপক্ষে 50% এরও বেশি, পেশাদার কোডিংয়ের 5+ বছর সময় লাগে, এবং আপনি কেবলমাত্র পাঠ্যক্রমটি পরিচালনা করতে পারবেন না যা 6 মাস দীর্ঘ, 20 বা তাই কয়েক ঘন্টা অভিজ্ঞতার সাথে থাকতে পারে।

যদি আমি সি-তে সি ++ কনস্ট্রাক্টস ব্যবহার করতাম তবে আমি স্ট্রিম ব্যবহার করতাম না, এগুলি পাখির চোখের দৃষ্টিকোণ থেকে সহজ উপায় এবং লোকেরা বিশ্বাস করে যে সফ্টওয়্যার বিকাশ সহজ, তবে অনেক পরিস্থিতিতে অনেক সুবিধা ছাড়াই অতিরিক্ত জটিলতাগুলি আড়াল করে।

সাধারণ ইন্টারফেসের জন্য RAII র্যাপার ক্লাস, টেম্পলেট, ওভারলোড, কনস্ট যথার্থতা এবং খাঁটি বিমূর্ত ক্লাসগুলি (দয়া করে এফ-এনজি জাভা উপায়টি ব্যবহার করবেন না দয়া করে!) তবে ভাল প্রার্থী। কারণ তারা সুরক্ষা, সাধারণতা এবং ব্যবহারের সহজতা যুক্ত করে যা বাস্তব জীবনের প্রকল্পগুলির জন্য খুব গুরুত্বপূর্ণ। ভার্চুয়াল ধ্বংস, ডিফল্ট অনুলিপি নির্মাণের বিস্ফোরক প্রকৃতি, রানটাইম ওভারহেড, কনস্ট যথার্থতা ইত্যাদি সম্পর্কে অবশ্যই মনে রাখবেন here

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.