কেন `মূল` ইনট বা অকার্যকর পরিবর্তে ডাবল বা স্ট্রিং ফিরিয়ে দিতে পারে না?


38

সি, সি ++, এবং জাভা এর মতো অনেক ভাষায়, mainপদ্ধতি / ফাংশনটির রিটার্ন টাইপ থাকে voidবা int, তবে না doubleবা হয় String। এর পিছনে কারণগুলি কী হতে পারে?

আমি কিছুটা জানি যে আমরা এটি করতে পারি না কারণ mainরানটাইম লাইব্রেরি বলে এবং এটি কিছু সিনট্যাক্সের মতো প্রত্যাশা করে int main()বা int main(int,char**)তাই আমাদের এটির সাথে লেগে থাকতে হবে।

সুতরাং আমার প্রশ্নটি হ'ল: mainস্বাক্ষরটির টাইপ স্বাক্ষর কেন রয়েছে এবং এটি আলাদা নয় কেন?


15
ডাবল রিটার্ন মান বলতে কী বোঝায় ? স্ট্রিং রিটার্ন মান বলতে কী বোঝায় ?

1
কি বুঝতে পারছে যে এর অর্থ কিছু নেই ut তবে অন্য কোনও কারণ এবং সম্মেলন?
জাভা

1
আমি এটা বুঝাতে চাই কিছু করে, কারণ বিশ্বজনীনভাবে এটা choosen হয়েছিল যে স্বাভাবিক প্রস্থান করুন এবং একটি abnormal.An int- এ জন্য একটি অ শূন্য 0 বিস্তৃত পরিবর্ত ভাষায় এর সঙ্গে সামঞ্জস্যপূর্ণ সহজ ডাটা টাইপ হিসেবে নির্বাচিত হয়েছে মনে @ delnan।
জাভা

@ সানি আমি ইউনিক্স-এর মতো ওএসের সাথে আমার অভিজ্ঞতা থেকে যে পরিমাণ সংগ্রহ করতে পেরেছি সেগুলি থেকে 0টিকে "স্বাভাবিক প্রস্থান" (0 টি ত্রুটি) হিসাবে ব্যবহৃত হয় কারণ এটি অন্যান্য সংখ্যার মানগুলির সাথে তুলনা করার সময় অস্পষ্ট। যেহেতু বেশিরভাগ (সমস্ত নয়) আধুনিক ভাষাগুলি সি এর সমতুল্য (যদি এর নকশাকৃত নকশাকৃত নয়) নকশাকৃত হয় এবং যেহেতু সি ইউনিক্স লেখার জন্য ব্যবহৃত হয়েছিল, তাই আমি বলব যে এটি এনআর দ্বারা .তিহাসিক সিদ্ধান্ত ছিল।
জেমি টেলর

3
@ সানি "ব্রড ক্রস ল্যাঙ্গুয়েজের সামঞ্জস্যতা" কোনও সমস্যা ছিল না। সি ও ইউএনআইএক্স লিখেছিল। অন্যান্য অনেক ভাষায় অন্তর ফেরত দেওয়ার কারণ হ'ল এগুলি ইউনিক্স বা ইউনিক্স-জাতীয় পরিবেশে কাজ করার জন্য তৈরি করা হয়েছিল।

উত্তর:


83

এর রিটার্ন মানটি একক, ধারাবাহিক উপায়ে mainঅপারেটিং সিস্টেমে (যে কোনও অপারেটিং সিস্টেম) পাস করতে হয় । অপারেটিং সিস্টেমটি যে তথ্যটি জানা দরকার তা হ'ল "প্রোগ্রামটি কি সফলভাবে শেষ হয়েছে, বা কোনও ত্রুটি হয়েছে?"

যদি এটি একটি স্ট্রিং হয় তবে বিভিন্ন ভাষায় প্রতিক্রিয়া মুশকিল হয়ে যায়। একটি পাস্কাল স্ট্রিং (প্রথম বাইট দৈর্ঘ্য) এবং একটি ফোরট্রান স্ট্রিং (নির্দিষ্ট, কিছু মান প্যাডেড) এবং একটি সি স্ট্রিং (নাল টার্মিনেটেড) এর ইন্টার্নালগুলি পৃথক। এটি অপারেটিং সিস্টেমের জন্য একটি সামঞ্জস্যপূর্ণ মান প্রদানকে চ্যালেঞ্জ করে তুলবে। এটির সমাধান হয়েছে বলে ধরে নিয়ে, ওএস প্রোগ্রামটির যে প্রশ্নটি করেছিল তার উত্তর দিতে আপনি কী করবেন? স্ট্রিং তুলনা ত্রুটি ("সাফল্য" বনাম "সাফল্য") দিয়ে পরিপূর্ণ এবং ত্রুটিটি যখন কোনও মানুষের পক্ষে আরও কার্যকর হতে পারে তবে অপারেটিং সিস্টেম বা অন্য কোনও প্রোগ্রাম (শেল) এর সাথে মোকাবেলা করা আরও বেশি কঠিন। এমনকি স্ট্রিংগুলিতেও তাদের মধ্যে উল্লেখযোগ্য পার্থক্য ছিল - ইবিসিডিক (এর সমস্ত কোড পৃষ্ঠা সহ) বনাম এএসসিআইআই।

ওএস (এবং শেল) এর সাথে ডেটা ব্যাক যোগাযোগের জন্য পূর্ণসংখ্যার উপরে ফ্লোট এবং ডাবলগুলি কোনও অতিরিক্ত মান সরবরাহ করে না। বেশিরভাগ অংশে, কম্পিউটারের এই অংশগুলির কোনওটিই ভাসমান পয়েন্ট সংখ্যাগুলি নিয়ে ডিল করে না। দ্বিগুণও তুলনামূলকভাবে তুলনা করা কঠিন নয়। গণনাযোগ্য নয়, তারা ত্রুটিটি কী তা রিপোর্ট করে তোলে (ধরে নিয়েছেন যে আপনি সাফল্যের জন্য একটি নির্দিষ্ট মান বেছে নিয়েছেন)। আবার, ভাসমান পয়েন্টগুলি সামঞ্জস্যপূর্ণ নয় - একটি 8 বিট মেশিনে ভাসমানটি 16 বিট এবং 32 বিট মেশিনে থাকা ফ্লোটের চেয়ে আলাদা ছিল (এবং সেগুলি কেবল 'সাধারণ' - এমনকি আইবিএমের মধ্যেও, ভাসমান পয়েন্টটি মানক করা হয়নি) 1980 এর দশক অবধি একই প্রস্তুতকারকের দ্বারা মেশিনের মধ্যে)। এবং তারপরে আপনি দশমিক বনাম বাইনারি কম্পিউটার পেয়েছেন। ভাসমান পয়েন্টের মানগুলি সামঞ্জস্যপূর্ণ নয় এবং অর্থবহ ডেটা ফেরত সরবরাহ করে না।

এটি সত্যই বিকল্প হিসাবে বাইট এবং পূর্ণসংখ্যার সাথে আমাদের ছেড়ে দেয়। যে কনভেনশনটি প্রতিষ্ঠিত হয়েছিল তা ছিল '0' সাফল্য, এবং অন্য যে কোনও কিছু ছিল ত্রুটি। একটি পূর্ণসংখ্যা ত্রুটির প্রতিবেদন করার জন্য বাইটের চেয়ে আরও বেশি ঘর দেয়। এটি গণনা করা যেতে পারে (1 এর রিটার্ন মানে XYZ, 2 এর রিটার্ন মানে ABC, 3 এর রিটার্ন, মানে ডিএফ, ইত্যাদি।) বা পতাকা হিসাবে ব্যবহৃত (এর 0x0001অর্থ এটি ব্যর্থ, এর 0x0002অর্থ ব্যর্থ হয়েছে, এটি 0x0003উভয় এবং এটি ব্যর্থ)। এটিকে কেবল একটি বাইটে সীমাবদ্ধ করা সহজেই পতাকাগুলি শেষ হতে পারে (মাত্র 8), সুতরাং সিদ্ধান্তটি সম্ভবত কোনও পূর্ণসংখ্যা ব্যবহারের সিদ্ধান্ত নেওয়া হয়েছিল।


2
আমার মনে হয় ওএস কল করার আগে মূলটিকে সি / সি ++ রানটাইম লাইব্রেরি দ্বারা ডাকা হয় যা আমাদের কোড সহ লোড করা কোডের একটি অংশ যা ওএস @ মাইকেলটি বলে
JAVA

5
main()বিভিন্ন অপারেটিং সিস্টেমে বিভিন্ন উপায়ে আবেদন করা হয়। সি-তে প্রাথমিক () পদ্ধতিটি প্রাথমিকভাবে কীভাবে বলা হয়? এই মধ্যে যায়।

22
আমি মনে করি যে বুঝতে mainপারা মূল বিষয়টি হ'ল - কোনও প্রোগ্রামের অন্যান্য ফাংশনের মতো না - এটি প্রোগ্রামার দ্বারা নির্ধারিত কোনও প্রোটোকলের অংশ নয়, তবে হোস্ট (ওএস) এর সাথে ইন্টারফেস করার জন্য ব্যবহৃত প্রোটোকল। আপনি এটি তুলবেন না কারণ এটি কখনও বাছাই করা আপনার ছিল না was আরও বাস্তববাদী স্তরে, ইউএনআইএক্স প্রত্যাশা করে যে কোনও প্রক্রিয়া দ্বারা কোনও প্রত্যাবর্তন ফিরে আসবে, এবং তাই সি-থেকে-ইউএনআইএক্স প্রোটোকল ঠিক তা করে। আর্গুমেন্ট-পাস করার জন্য একটি অ্যানালগাস যুক্তি তৈরি করা যেতে পারে: যদি সি কোনও ওএস / হোস্টের জন্য আবিষ্কার করা হয়েছিল যা কেবলমাত্র আর্গুমেন্ট হিসাবে অঙ্ক করে (যেমন কোনও কমান্ড-লাইন নেই), আর্গুমেন্টগুলি স্ট্রিংয়ের পরিবর্তে অন্তর্নিহিত হবে।
ইউরো মিশেল্লি

2
আইবিএম তাদের পিসিতে ইবিসিডিক থেকে কোড পৃষ্ঠাগুলির ধারণা নিয়েছিল। আইবিএম 5150 প্রবর্তনের 35 বছর পরে তারা এখনও আমাদের আক্ষেপ করে চলেছে 7 বিট ASCII কোডপেজ কম, তবে সেটিংসের উপর নির্ভর করে একক কম্পিউটারেও 8-বিট অক্ষর কোডগুলি বিভিন্নভাবে ব্যাখ্যা করা যেতে পারে - - বহু-বাইট এনকোডিংগুলির জন্য কোডটি কোডপেজগুলিকে ছেড়ে দিন। সুতরাং এটি দ্বিতীয় অনুচ্ছেদের শেষ বাক্যে আপনি যা বোঝাচ্ছেন তার চেয়ে এটি আরও খারাপ
একটি সিভিএন

@ ইউরোমিসেলি এটি একটি খুব সুন্দর তথ্য যা আসলে তার জন্য ধন্যবাদ :)
জাভা

27

ভাল, এটা পারে

উদাহরণস্বরূপ, প্ল্যান 9 অপারেটিং সিস্টেমে ব্যবহৃত সি এর উপভাষায় mainসাধারণত একটি voidফাংশন হিসাবে ঘোষিত হয় , তবে প্রস্থান স্থিতিটি ফাংশনটিতে একটি স্ট্রিং পয়েন্টার পাস করে কলিং পরিবেশে ফিরে আসে exits()। খালি স্ট্রিং সাফল্য বোঝায় এবং যে কোনও ফাঁকা স্ট্রিং কোনও প্রকার ব্যর্থতা বোঝায়। এই পারে না থাকার বাস্তবায়িত হয়েছে mainএকটি ফিরতি char*ফলাফল।

এবং অবশ্যই floatবা একটি doubleপ্রস্থান স্থিতি সহ একটি সিস্টেম বাস্তবায়ন করা সম্ভব হবে ।

তাহলে কেন int? এটি কেবল সম্মেলনের বিষয় - এবং তাদের অধীনে পরিচালিত অপারেটিং সিস্টেম এবং প্রোগ্রামগুলি রাখার একটি দুর্দান্ত মূল্য রয়েছে যা একটি সাধারণ কনভেনশন মেনে চলে।

ইউনিক্স কনভেনশনটি হ'ল 0 সাফল্য এবং অ-শূন্যকে চিহ্নিতকরণ ব্যর্থতার সাথে পূর্ণসংখ্যা স্থিতি কোড ব্যবহার করা হয় (কারণ সাধারণত সফল হওয়ার একমাত্র উপায় তবে ব্যর্থ হওয়ার একাধিক উপায় রয়েছে)। আমি জানি না যে এই সম্মেলনের উদ্ভব ইউনিক্স থেকে হয়েছিল; আমার সন্দেহ হয় এটি পূর্ববর্তী অপারেটিং সিস্টেম থেকে এসেছে।

ভাসমান-পয়েন্টটি আরও কঠিন সম্মেলন হবে, কারণ (ক) ভাসমান-বিন্দু সমর্থন সর্বজনীন নয়, (খ) ভাসমান-পয়েন্টের মান এবং ত্রুটির অবস্থার মধ্যে একটি ম্যাপিং সংজ্ঞা দেওয়া আরও কঠিন, (গ) বিভিন্ন সিস্টেম বিভিন্ন ভাসমান- উপস্থাপনা উপস্থাপনা এবং (ঘ) আপনার প্রোগ্রামের প্রস্থান স্থিতিতে কোনও গোলাকার ত্রুটি সনাক্ত করার মজাটি কেবল কল্পনা করুন। অন্যদিকে, পূর্ণসংখ্যার ত্রুটি কোডগুলি গণনায় নিজেকে খুব ভাল ধার দেয়।

পরিকল্পনা 9, যেমনটি আমি উল্লেখ করেছি, স্ট্রিংগুলি ব্যবহার করে, তবে এটি মেমরি পরিচালনা, চরিত্রের এনকোডিং ইত্যাদির জন্য কিছুটা জটিলতা আরোপ করে It ব্যাপক সম্মেলন।

(উল্লেখ্য, C ++ mainপারেন শুধুমাত্র আসতে int, এবং সি void mainশুধুমাত্র যদি কম্পাইলার বিশেষভাবে এটি সমর্থন অনুমোদিত হয়। অনেক কম্পাইলার খুব জোরে যদি আপনি লিখতে অভিযোগ না void main, কিন্তু এটা বলতে শুধুমাত্র সামান্য অত্যুক্তি যে এটা ভুল ।)


9

মূল পদ্ধতিতে ফিরে আসা মানটি একটি "প্রস্থান কোড"। এটি কলার অ্যাপ্লিকেশন (সাধারণত বাশ) দ্বারা প্রোগ্রামটি প্রত্যাশা অনুযায়ী শেষ হয়েছে কিনা তা পরীক্ষা করতে ব্যবহার করা হয়। কোনও পূর্ণসংখ্যা ফেরত দেওয়া ওএস স্তরে এটি করার সহজতম উপায়। দ্বিগুণ ত্রুটি কোডের জন্য কোনও অর্থবোধ করে না এবং একটি স্ট্রিং ওএস স্তরে বজায় রাখা শক্ত (কোনও জিসি নেই)।


3
একটি পূর্ণসংখ্যার সময় না কেন স্ট্রিংয়ের আবর্জনা সংগ্রহ করা দরকার?
ব্র্যাড

4
@ ব্র্যাড, স্ট্রিংগুলির তাদের পরিবর্তনশীল দৈর্ঘ্য রয়েছে এবং মূলত এটি এমন হবে যে অ্যারে পিছনে যা একটি চরিত্র হতে পারে বা এটি হাজার হাজার হতে পারে back ডায়নামিক মেমোরি একটি ব্যথা হতে পারে যখন কোনও ইন্টার একটি স্থির আকার হয় যা পরিচালনা করা এতটা কঠিন নয়।
জেবি কিং
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.