প্রথমত, যেমন বেশ কিছু উত্তর স্পর্শ কিন্তু, আমার মন, বানান আউট পরিষ্কারভাবে যথেষ্ট: এটা করে কাজে একটি পূর্ণসংখ্যা প্রদান সবচেয়ে প্রেক্ষিতে যেখানে একটি লাইব্রেরি ফাংশন একটি সময় লাগে doubleবা floatযুক্তি। সংকলক স্বয়ংক্রিয়ভাবে একটি রূপান্তর sertোকাবে। উদাহরণস্বরূপ, sqrt(0)ভালভাবে সংজ্ঞায়িত করা হয়েছে এবং ঠিক তেমন আচরণ করবে sqrt((double)0)এবং সেখানে ব্যবহৃত অন্য কোনও পূর্ণসংখ্যার ধরণের এক্সপ্রেশনটির ক্ষেত্রেও এটি একই।
printfএটা ভিন্ন. এটি ভিন্ন কারণ এটি একটি পরিবর্তনশীল সংখ্যক আর্গুমেন্ট নেয়। এর ফাংশন প্রোটোটাইপ হয়
extern int printf(const char *fmt, ...);
অতএব, আপনি যখন লিখুন
printf(message, 0);
সংকলকটি কী ধরণের দ্বিতীয় printf তর্কটি প্রত্যাশা করে সে সম্পর্কে কোনও তথ্য নেই । এটিতে কেবল যুক্তি প্রকাশের ধরণ রয়েছে, যা intদিয়ে যাওয়া। অতএব, বেশিরভাগ লাইব্রেরির ফাংশনগুলির বিপরীতে, প্রোগ্রামার আপনার পক্ষে, আর্গুমেন্টের তালিকাটি বিন্যাসের স্ট্রিংয়ের প্রত্যাশার সাথে মেলে তা নিশ্চিত করে তোলা।
(আধুনিক সংকলকগণ একটি ফর্ম্যাট স্ট্রিংটি সন্ধান করতে পারে এবং আপনাকে জানাতে পারে যে আপনার কাছে কী ধরনের অমিল রয়েছে তবে তারা কী বোঝাতে চেয়েছিল তা সম্পাদন করার জন্য রূপান্তরগুলি সন্নিবেশ করা শুরু করবে না, কারণ আপনার কোডটি এখন ভাঙা উচিত, যখন আপনি লক্ষ্য করবেন , কয়েক বছর পরে কম সহায়ক সংকলক দিয়ে পুনর্নির্মাণ যখন।)
এখন, প্রশ্নের অর্ধেকটি ছিল: বেশিরভাগ আধুনিক সিস্টেমে (int) 0 এবং (ভাসমান) 0.0 টি দেওয়া, উভয়ই 32 বিট হিসাবে উপস্থিত সমস্তগুলি শূন্য, কেন এটি দুর্ঘটনাক্রমে কার্যকর হয় না? সি স্ট্যান্ডার্ডটি কেবল বলেছে "এটি কাজ করার দরকার নেই, আপনি নিজেরাই আছেন", তবে এটি কাজ করবে না কেন দুটি সবচেয়ে সাধারণ কারণ সম্পর্কে আমাকে বানান করতে দিন; যে সম্ভবত সাহায্য করবে আপনি বুঝতে কেন এটা প্রয়োজনীয় না।
প্রথমত, reasonsতিহাসিক কারণে, আপনি যখন floatএকটি পরিবর্তনশীল আর্গুমেন্ট তালিকার মাধ্যমে পাস করেন এটি উন্নীত হয় double, যা বেশিরভাগ আধুনিক সিস্টেমে 64৪ বিট প্রশস্ত। সুতরাং তাদের printf("%f", 0)32 টির প্রত্যাশী কেবল 32 শূন্য বিট পাস করুন cal
দ্বিতীয়, সমান তাত্পর্যপূর্ণ কারণ হ'ল ভাসমান-পয়েন্ট ফাংশন আর্গুমেন্টগুলি পূর্ণসংখ্যার তর্কগুলির চেয়ে আলাদা জায়গায় পাস করা যেতে পারে । উদাহরণস্বরূপ, বেশিরভাগ সিপিইউতে পূর্ণসংখ্যা এবং ফ্লোটিং-পয়েন্ট মানগুলির জন্য পৃথক রেজিস্টার ফাইল থাকে, সুতরাং এটি একটি নিয়ম হতে পারে যে 0 থেকে 4 এর মধ্যে আর্গুমেন্টগুলি রেজিস্টারগুলিতে r4 এর মাধ্যমে r4 এর মাধ্যমে পূর্ণসংখ্যা হয়, তবে f4-এর মাধ্যমে f0 হয় যদি তারা ভাসমান-পয়েন্ট হয়। সুতরাং printf("%f", 0)যে শূন্য জন্য রেজিস্টার f1 দেখুন, কিন্তু এটি মোটেও নেই।
printfএকটি আশা করছেdouble, এবং আপনি এটি একটি প্রদান করছিint।floatএবংintআপনার মেশিনে একই আকার হতে পারে, তবে0.0fবাস্তবেdoubleএকটি বৈকল্পিক যুক্তি তালিকায় ধাক্কা দেওয়ার সময় এটি রূপান্তরিত হয় (এবং এটিprintfপ্রত্যাশা করে)। সংক্ষেপে, আপনি যেprintfসুনির্দিষ্ট ব্যবহার করছেন তা এবং আপনি যে যুক্তি সরবরাহ করছেন তার উপর ভিত্তি করে আপনি দর কষাকষির শেষ করছেন না ।