সি স্টাইল printf()
(বা puts()
বা putchar()
...) আউটপুট সি ++ - স্টাইল std::cout << ...
আউটপুট মিশ্রিত করা অনিরাপদ হতে পারে। আমি যদি সঠিকভাবে স্মরণ করি তবে তাদের পৃথক বাফারিং প্রক্রিয়া থাকতে পারে, সুতরাং আউটপুটটি সম্ভবত আদেশিতভাবে প্রদর্শিত নাও হতে পারে। (যেমন এপ্রোগ্রামার একটি মন্তব্যে উল্লেখ করেছেন, sync_with_stdio
এটিকে সম্বোধন করেছেন)।
printf()
মূলত টাইপ-অনিরাপদ। আর্গুমেন্টের জন্য প্রত্যাশিত প্রকারটি ফর্ম্যাট স্ট্রিং দ্বারা নির্ধারিত হয় ( "%d"
এমন একটি int
বা এমন কিছু প্রয়োজন যা প্রচার করে int
, "%s"
এমন একটি প্রয়োজন char*
যা সঠিকভাবে বন্ধ হওয়া সি-স্টাইলের স্ট্রিং ইত্যাদির দিকে নির্দেশ করতে পারে), তবে ভুল প্রকারের যুক্তিটি অপ্রকাশিত আচরণের ফলে পাস করা হয় , ডায়াগোনসযোগ্য ত্রুটি নয়। কিছু সংকলক, যেমন জিসিসি, প্রকারের মিলগুলি সম্পর্কে সতর্ক করার পক্ষে যুক্তিসঙ্গতভাবে ভাল কাজ করে তবে ফর্ম্যাট স্ট্রিংটি আক্ষরিক বা অন্যথায় সংকলন সময়ে (যা সর্বাধিক সাধারণ ঘটনাটি হয়) হিসাবে পরিচিত হয় তবেই তারা এটি করতে পারে - এবং এই জাতীয় সতর্কবার্তা ভাষা দ্বারা প্রয়োজন হয় না। আপনি যদি ভুল ধরণের তর্কটি পাস করেন তবে ইচ্ছামত খারাপ জিনিস ঘটতে পারে।
অপরদিকে সি ++ এর স্ট্রিম I / O, অনেক বেশি টাইপ-নিরাপদ, যেহেতু <<
অপারেটরটি বিভিন্ন ধরণের জন্য ওভারলোড হয়। std::cout << x
এর ধরণ নির্দিষ্ট করতে হবে না x
; সংকলক যেকোন প্রকারের জন্য সঠিক কোড উত্পন্ন করবে x
।
অন্যদিকে, printf
ফর্ম্যাটিং বিকল্পগুলি IMHO অনেক বেশি সুবিধাজনক। দশমিক পয়েন্টের পরে যদি আমি 3 সংখ্যার সাথে ভাসমান-পয়েন্ট মানটি মুদ্রণ করতে চাই তবে আমি ব্যবহার করতে পারি "%.3f"
- এবং একই printf
কলের মধ্যেও এটি অন্যান্য আর্গুমেন্টগুলিতে কোনও প্রভাব ফেলবে না । setprecision
অন্যদিকে, সি ++ এর স্ট্রিমের অবস্থা প্রভাবিত করে এবং যদি আপনি স্ট্রিমটিকে আগের অবস্থাতে পুনরুদ্ধার করতে খুব সচেতন না হন তবে পরে আউটপুট জগাখিচুড়ি করতে পারে। (এটি আমার ব্যক্তিগত পোষ্যের উঁকি; এটি এড়াতে যদি আমি কোনও পরিষ্কার উপায় মিস করি তবে মন্তব্য করুন।)
উভয় সুবিধা এবং অসুবিধা আছে। printf
আপনার যদি কোনও সি ব্যাকগ্রাউন্ড থাকে এবং আপনি এর সাথে আরও পরিচিত হন বা আপনি যদি কোনও সি ++ প্রোগ্রামে সি উত্স কোড আমদানি করেন তবে এর প্রাপ্যতাটি বিশেষত কার্যকর। std::cout << ...
সি ++ এর জন্য আরও বুদ্ধিমানের, এবং ধরণের অমিলটি এড়াতে তত যত্নের প্রয়োজন হয় না। উভয়ই বৈধ সি ++ (সি ++ স্ট্যান্ডার্ডটিতে রেফারেন্সের মাধ্যমে বেশিরভাগ সি স্ট্যান্ডার্ড লাইব্রেরি অন্তর্ভুক্ত থাকে)।
এটা সম্ভবত ব্যবহার করা সর্বোত্তম std::cout << ...
অন্যান্য সি ++ প্রোগ্রামারদের আপনার কোডের উপর কাজ করতে পারে অনুরোধে জন্য, কিন্তু আপনি হয় এক ব্যবহার করতে পারেন - বিশেষত ট্রেস কোডে যে আপনার বর্জন করা যাচ্ছি।
এবং অবশ্যই এটি ডিবাগারগুলি কীভাবে ব্যবহার করতে হয় তা শেখার জন্য কিছুটা সময় ব্যয় করার উপযুক্ত (তবে এটি সম্ভবত কিছু পরিবেশে সম্ভব নয়)।
printf
সি ++ বিশ্বে? আমি এখানে কিছু মিস করছি?