মূল বিবরণে প্রস্থান বিবরণ বনাম প্রস্থান ()


197

আমার exit()কি কেবল returnবিবৃতি ব্যবহার করা উচিত main()? ব্যক্তিগতভাবে আমি returnবিবৃতিগুলির পক্ষে মতামত করি কারণ আমি মনে করি যে এটি অন্য কোনও ফাংশন এবং প্রবাহ নিয়ন্ত্রণ পড়ার মতো মনে হচ্ছে যখন আমি কোডটি পড়ছি মসৃণ (আমার মতে)। এমনকি আমি যদি main()ফাংশনটি রিফ্যাক্টর করতে returnচাই তবে তার চেয়ে আরও ভাল পছন্দ মনে হচ্ছে exit()

না exit()বিশেষ কিছু যে কি returnনা?

উত্তর:


277

আসলে, সেখানে হয় একটি পার্থক্য, কিন্তু এটা সূক্ষ্ম। এটিতে সি ++ এর জন্য আরও জড়িত রয়েছে, তবে পার্থক্যগুলি গুরুত্বপূর্ণ।

আমি যখন কল returnমধ্যে main(), destructors আমার স্থানীয়ভাবে scoped অবজেক্টের জন্য ডাকা হবে। যদি আমি কল exit(), কোন বিনাশকারী আমার স্থানীয়ভাবে scoped বস্তু জন্য ডাকা হবে! আবার পড়ুন। exit() ফিরে আসে না । তার মানে এই যে আমি একবার এটি কল করলে সেখানে "কোনও পিঠ নেই"। এই ফাংশনে আপনি যে কোনও অবজেক্ট তৈরি করেছেন তা ধ্বংস হবে না। প্রায়শই এর কোনও জড়িত থাকে না, তবে কখনও কখনও এটি ফাইলগুলি বন্ধ করার মতো করে (অবশ্যই আপনি আপনার সমস্ত ডেটা ডিস্কে ফ্লাশ করতে চান?)।

মনে রাখবেন যে staticআপনি কল করলেও অবজেক্টগুলি পরিষ্কার হয়ে যাবে exit()। পরিশেষে নোট করুন, আপনি যদি ব্যবহার করেন তবে abort()কোনও বস্তু নষ্ট হবে না। এটি হ'ল কোনও গ্লোবাল অবজেক্ট, কোনও স্ট্যাটিক অবজেক্ট এবং কোনও স্থানীয় অবজেক্টে তাদের ডেস্ট্রাক্টরদের ডাকা হবে না।

রিটার্নের বাইরে যাওয়ার প্রস্থান করার সময় সাবধানতার সাথে এগিয়ে যান।

http://groups.google.com/group/gnu.gcc.help/msg/8348c50030cfd15a


1
অ্যাবੋਰਟ () ত্রুটি শর্তের সাথে প্রস্থান করে (শূন্য-বহির্গমন কোড) এবং এটি একটি মূলও হতে পারে। আপনার যদি ডাব্লু / ও কলিং স্ট্যাটিক ডেস্ট্রাক্টরগুলি থেকে প্রস্থান করতে হয় তবে _exit ব্যবহার করুন।

7
@ মাইক: সি লাইব্রেরি ফাইল বাফার এবং সি ++ ফাইল স্ট্রিম অবজেক্টের মধ্যে পার্থক্য রয়েছে। প্রস্থান () - সি লাইব্রেরির অংশ হওয়ায় - এটি পূর্বের সাথে সমন্বয় ও ফ্লাশ করার জন্য তৈরি করা হয়েছিল, তবে পরবর্তীটি বাইপাস করতে পারে: এমনকি স্ট্যান্ডার্ড সি ++ fstream সামগ্রীটি ডিস্কে ফ্লাশ করা হয়নি (চেষ্টা করে দেখুন - এটি ব্যর্থ হয়েছে / লিনাক্স / জিসিসি), এবং স্পষ্টতই ব্যবহারকারী-সংজ্ঞায়িত প্রকারের যেগুলি I / O বাফার করেছে সেগুলিও ফ্লাশ হওয়ার আশা করা যায় না।
টনি ডেলরয়

9
দ্রষ্টব্য: বিবৃতি: আমার স্থানীয়ভাবে বিস্তৃত বস্তুর জন্য কোনও ডেস্ট্রাস্টারকে ডাকা হবে না! সি ++ 11 এর জন্য আর সত্য নয়: - থ্রেড স্টোরেজ সময়কালের সাথে বর্তমান থ্রেডের সাথে যুক্ত অবজেক্টগুলি ধ্বংস করা হয়েছে (কেবলমাত্র C ++ 11)। cplusplus.com/references/cstdlib/exit
Ilendir

7
এর অর্থ, thread_localবস্তুর ধ্বংসকারীদের ডাকা হবে। অন্যান্য স্থানীয় বস্তুর জন্য ধ্বংসকারীদের এখনও ডাকা হয় না। ideone.com/Y6Dh3f
হলিব্ল্যাকগ্যাট

3
বিটিডাব্লু, এবং কেবল পেডেন্টিক হতে এবং কারণ এই উত্তরটি এখনও সি ব্যবহার করে পাঠকদের জন্য বিভ্রান্তিকর হতে পারে: সি এর জন্য exit()ফাইলগুলি পরিষ্কারভাবে বন্ধ করার বিষয়টি আসলে ভুল। কেবলমাত্র একবার ডেটা ফ্লাশ না করা হতে পারে বিপরীত ক্ষেত্রে: উদাহরণস্বরূপ যদি কেউ এর returnথেকে ব্যবহার করে main()এবং কেউ কল করেছে setbuf()বা setvbuf()একটি বাফার দিয়ে স্বয়ংক্রিয় স্টোরেজ হিসাবে ঘোষিত হয়েছে main()(নীচে আর এর উত্তরে আলোচনা করা হয়েছে)। সত্যিই খুব খারাপ যে এই প্রশ্নটি সি এবং সি ++ (এবং কোডিং-স্টাইল - এটি কোনও স্টাইলের সমস্যা নয়!) দিয়ে ট্যাগ করা আছে।
গ্রেগ এ উডস 21

25

আর একটি পার্থক্য: exitএকটি স্ট্যান্ডার্ড লাইব্রেরি ফাংশন যাতে আপনার শিরোনাম এবং স্ট্যান্ডার্ড লাইব্রেরির সাথে লিঙ্ক করা প্রয়োজন। চিত্রিত করতে (সি ++ এ), এটি একটি বৈধ প্রোগ্রাম:

int main() { return 0; }

তবে ব্যবহার exitকরতে আপনার একটি অন্তর্ভুক্ত দরকার:

#include <stdlib.h>
int main() { exit(EXIT_SUCCESS); }

এছাড়াও এটি একটি অতিরিক্ত অনুমান যুক্ত করে: কলিং exitথেকে mainশূন্য ফিরে আসার মতো একই পার্শ্ব প্রতিক্রিয়া রয়েছে। অন্যরা যেমন উল্লেখ করেছে, আপনি কোন ধরণের কার্যকর হতে চলেছেন তার উপর নির্ভর করে (যেমন, কে ডাকছেন main)। আপনি কি এমন কোনও অ্যাপ কোডিং করছেন যা সি-রানটাইম ব্যবহার করে? একটি মায়া প্লাগইন? একটি উইন্ডোজ পরিষেবা? একজন চালক? প্রতিটি ক্ষেত্রে exitসমতুল্য কিনা তা অনুসন্ধানের প্রয়োজন হবে return। আইএমএইচও exitযখন আপনার সত্যিকার অর্থে বোঝায় return তখন কোডটি আরও বিভ্রান্ত করে তোলে। OTOH, আপনি যদি সত্যিই এটি বোঝাতে চান exit , তবে সব উপায়ে এটি ব্যবহার করুন।


16

সেখানে পছন্দ অন্তত একটি কারণ নেই exit: আপনার কোন atexitহ্যান্ডেলার স্বয়ংক্রিয়-স্টোরেজ-সময়কাল তথ্য পড়ুন main, অথবা যদি আপনি ব্যবহৃত setvbufবা setbufমান এক দায়িত্ব অর্পণ করা একটি স্বয়ংক্রিয়-স্টোরেজ-সময়কাল মধ্যে বাফার স্ট্রীম করে main, তারপর থেকে ফিরে mainউৎপন্ন অপরিজ্ঞাত আচরণ, তবে কলিংটি exitবৈধ।

আর একটি সম্ভাব্য ব্যবহার (সাধারণত খেলনা প্রোগ্রামগুলির জন্য সংরক্ষিত থাকে) এর পুনরাবৃত্তির অনুরোধ সহ একটি প্রোগ্রাম থেকে বেরিয়ে আসা main


1
@Seb এর সম্পর্কে বিশেষ কিছু নেই main()- এটি কেবল অন্যর মতো একটি ফাংশন। অন্যদিকে যেহেতু এটি স্ট্যান্ডার্ডে বিশেষ উল্লেখ রয়েছে তাই মানকটি এটি কীভাবে সংজ্ঞায়িত করে main()এবং কী কী জিনিস এটি তার নিকট এবং প্রিয় তা সম্পর্কে মোটামুটি সতর্কতা অবলম্বন করা উচিত । তবে শেষ পর্যন্ত যদিও স্ট্যান্ডার্ডটির মধ্যে স্বয়ংক্রিয় স্টোরেজ সম্পর্কে বিশেষ কিছু করার জন্য সংকলকগুলির প্রয়োজন নেই (এবং আবশ্যক নয় ) main()। আপনি আপনার মন্তব্যে উল্লিখিত অনুচ্ছেদের নীচে পাদটীকা # 11 পড়তে দয়া করে যত্ন নিন ।
গ্রেগ এ উডস

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

2
@ এসইবি: উদ্দেশ্যটি হ'ল স্বয়ংক্রিয় স্টোরেজগুলির আচরণের উপর প্রয়োজনীয়তাগুলিকে ওভাররাইড না করার জন্য এবং পাদটীকা স্পষ্টতই এটি স্পষ্ট করার জন্য লেখা হয়েছিল। হ্যাঁ সি স্ট্যান্ডার্ডটিতে অনর্থক, দুর্বল কথা বলা আছে। যে কেউ এটি পড়েছে সে এটি জানে। আমরা আরও জানি যে কমিটি সাধারণত এ জাতীয় সমস্যাগুলি সমাধান করে না কারণ উদ্দেশ্য ইতিমধ্যে সুস্পষ্ট।
আর .. গিটহাব বন্ধ হেল্পিং আইসিসি

1
@ সেব: আপনি ঠিক বলেছেন তা প্রমাণ করার জন্য এটি কোনও বিতর্ক বা আদালতের মামলা নয়। লক্ষ্য করা উচিত কি প্রকৃত সি ল্যাঙ্গুয়েজ (হিসাবে উদ্দীষ্ট এবং বাস্তবায়িত হিসাবে) হয় এক স্পষ্ট বোধগম্যতা প্রাপ্তির হবে, এবং উত্তরগুলি পাঠকদের উপযোগী মধ্যে প্রকাশ হয়। মূল পাঠ্যটি সম্পূর্ণরূপে ভুল (যা প্রকাশ করা উচিত ছিল তার উদ্দেশ্যের বিপরীতে) মূলত পাদটীকা দ্বারা স্থির। আপনি যদি এতে সন্তুষ্ট না হন তবে একটি ত্রুটিপূর্ণ প্রতিবেদন জমা দিন, তবে কোনও উত্তর আশা করবেন না। এভাবেই ডাব্লুজি 14 রোল করে ...
আর ..

3
@ এসেব: আপনি বিশ্বাস করেন যে সি ভাষার ভাষাটি স্ট্যান্ডার্ডের প্রাকৃতিক ভাষার পাঠ্যকে ব্যাখ্যা করে বোঝা যায় যেন এটি সম্পূর্ণ কঠোর হয়। এটি সহজভাবে সম্ভব নয়। স্পেসিফিকেশনটিতে ভুল রয়েছে এবং ডাব্লুজি 14 তাদের পুনর্লিখনের জিনিসগুলি নষ্ট করবে না যখন একটি সাধারণ পাদটীকা স্পষ্ট করে যে তারা ইতিমধ্যে জানে যে তারা ভুল করেছে তবে পাঠক এটি বুঝতে পারেন।
আর .. গীটহাব বন্ধ করুন ICE

5

আমি সর্বদা ব্যবহার করি returnকারণ এর জন্য প্রমিত প্রোটোটাইপ main()বলে যে এটি কোনওরূপে ফিরে আসে না int

এটি বলেছিল, মানকগুলির কয়েকটি সংস্করণ mainবিশেষ চিকিত্সা দেয় এবং ধরে নেওয়া যায় যে কোনও স্পষ্ট returnবিবৃতি না থাকলে 0 ফিরে আসে । নিম্নলিখিত কোড দেওয়া:

int foo() {}
int main(int argc, char *argv[]) {}

জি ++ কেবল এর জন্য একটি সতর্কতা উত্পন্ন foo()করে এবং এর থেকে অনুপস্থিত রিটার্ন উপেক্ষা করে main:

% g++ -Wall -c foo.cc
foo.cc: In function int foo()’:
foo.cc:1: warning: control reaches end of non-void function

আমি সি সম্পর্কে জানি না, তবে সি ++ স্ট্যান্ডার্ডটি উল্লেখ করে যে আপনি যদি প্রধানত কোনও মান না ফেরান তবে এটি 0 ফিরে আসবে বলে ধরে নেওয়া হয়েছে
জেসন বেকার

দেখে মনে হচ্ছে সি 99 একই: faq.cprogramming.com/cgi-bin/…
জেসন বেকার

2
কোনও রিটার্নের বিবৃতি না থাকলে C99 এবং C ++ 0 রিটার্ন করুন, C90 দেয় না।
d0k

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

@ গ্রেগা.ডুবগুলি আপনার মতামত, তবে একটি ডাউন ভোট খুব কমই যোগ্য! আমি উপরে যা লিখেছি তা পুরোপুরি মানের সাথে সামঞ্জস্যপূর্ণ , যদিও আপনার যুক্তিটি কেবল শব্দার্থক ics
Alnitak

5

প্রোগ্রামটি শেষ হওয়ার আগে পুনরায় দাবিতে স্বয়ংক্রিয় স্টোরেজ না এড়াতে প্রস্থান () ব্যবহার করার বিষয়ে আমি আর এর মন্তব্যে দৃ second ়ভাবে দ্বিতীয়টি second main()এর মধ্যে একটি return X;বিবৃতি main()যথাযথভাবে কল করার সমতুল্য নয় exit(X);, যেহেতু ফিরে আসে main()তখন গতিশীল স্টোরেজ অদৃশ্য হয়ে যায় main(), তবে exit()পরিবর্তে কল করা হলে তা বিলুপ্ত হয় না ।

তদ্ব্যতীত, সি বা যে কোনও সি-জাতীয় ভাষায় একটি returnবিবৃতি পাঠককে দৃ strongly়ভাবে ইঙ্গিত করে যে মৃত্যুদণ্ড কার্যকর করার কলিং কার্যক্রমে চলতে থাকবে, এবং মৃত্যুদন্ড কার্যকর করার এই ধারাবাহিকতাটি সাধারণত প্রযুক্তিগতভাবে সত্য যদি আপনি সি স্টার্টআপ রুটিনকে গণনা করেন যা আপনার main()ফাংশন বলে, এটি নয় ঠিক কি আপনি বলতে চাচ্ছি যখন প্রক্রিয়াটি শেষ করতে মানে।

সর্বোপরি, আপনি যদি অন্য কোনও ফাংশন থেকে আপনার প্রোগ্রামটি শেষ করতে চান তবে main()আপনাকে কল করতে হবেexit()main()পাশাপাশি ধারাবাহিকভাবে করা আপনার কোডটিকে আরও বেশি পঠনযোগ্য করে তোলে এবং এটি আপনার কোডকে পুনরায় ফ্যাক্টর করাও আরও সহজ করে তোলে; উদাহরণস্বরূপ main()অন্য কোনও ফাংশনে অনুলিপি করা কোড দুর্ঘটনাকৃত returnবক্তব্যগুলির কারণে দুরাচারণ করবে না যা কল করা উচিত ছিলexit()

সুতরাং, এই পয়েন্টগুলির একত্রিত করে উপসংহারটি হ'ল প্রোগ্রামটি শেষ করার জন্য একটি বিবৃতি ব্যবহার করা কমপক্ষে সি এর পক্ষে এটি একটি খারাপ অভ্যাসreturnmain()


আপনি সি স্ট্যান্ডার্ড 5.1.2.2.3p1 আকর্ষণীয় খুঁজে পেতে পারেন ...
অটিস্টিক

এই উত্তরটি সি প্রোগ্রামগুলির জন্য সতর্কতার সাথে বিবেচনা করার মতো, যা উত্তরে প্রসঙ্গে বর্ণিত হয়েছে। সি ++ এর সাথে ব্যবহারের জন্য, পূর্বে উল্লিখিত সমস্ত ক্যাভেটের বিরুদ্ধে সাবধানে ওজন করা দরকার। সি ++ এর জন্য, আমি exit()সাধারণভাবে এড়াতে পরামর্শ দেব , তবে কোনও throwবা abort()বিকল্প কোনও নির্দিষ্ট প্রসঙ্গে কাজ না করলে এটি ব্যবহার করব do তবে বিশেষত exit()প্রধান এড়াতে এবং মূল অনুশীলনের পরিবর্তে মূলত রিটার্ন ব্যবহার করা।
এলজয়

5

প্রস্থান () 'রিটার্ন' না করে এমন কোনও বিশেষ কাজ করে?

অস্বাভাবিক প্ল্যাটফর্মগুলির জন্য কয়েকটি সংকলক সহ, exit()এটির যুক্তিটি আপনার প্রোগ্রামের প্রস্থান মূল্যতে অনুবাদ করতে পারে যখন কোনওর কোনও প্রত্যাবর্তন main()কেবল কোনও অনুবাদ ছাড়াই হোস্ট পরিবেশে সরাসরি মানটি পাস করে।

স্ট্যান্ডার্ডের ক্ষেত্রে এই ক্ষেত্রে অভিন্ন আচরণের প্রয়োজন হয় (বিশেষত, এটি বলে যে এমন কিছু intথেকে উপযুক্ত returning যেটি উপযুক্ত returning মানটির main()সাথে কল করার সমতুল্য হওয়া উচিত exit()) সমস্যাটি হ'ল প্রস্থান মানগুলি ব্যাখ্যা করার জন্য বিভিন্ন ওএসের বিভিন্ন কনভেনশন রয়েছে। অনেকগুলি (বহু!) সিস্টেমে 0 এর অর্থ সাফল্য এবং অন্য যে কোনও কিছুই ব্যর্থতা। তবে, বলুন, ভিএমএস, বিজোড় মানগুলির অর্থ সাফল্য এবং এমনকি এর অর্থ ব্যর্থতা। আপনি যদি 0 থেকে ফিরে এসেছেন তবে main()কোনও ভিএমএস ব্যবহারকারী অ্যাক্সেস লঙ্ঘনের বিষয়ে একটি বাজে বার্তা দেখতে পাবেন। আসলে অ্যাক্সেস লঙ্ঘন হয়নি - এটি কেবলমাত্র ব্যর্থতা কোড 0 এর সাথে যুক্ত স্ট্যান্ডার্ড বার্তা ছিল।

তারপরে এএনএসআই এসেছিল এবং আশীর্বাদ করেছে EXIT_SUCCESSএবং EXIT_FAILUREযুক্তি হিসাবে আপনি যা করতে পারেন exit()। স্ট্যান্ডার্ডটি আরও বলে যে এটি exit(0)একইরকম আচরণ করা উচিত exit(EXIT_SUCCESS), তাই বেশিরভাগ বাস্তবায়ন সংজ্ঞায়িত EXIT_SUCCESSহয় 0

স্ট্যান্ডার্ডটি অতএব, আপনাকে ভিএমএসের সাথে আবদ্ধ রাখে, কারণ এটি ব্যর্থতার কোডটি ফিরে পাওয়ার কোনও মান রাখে না যার মান 0 থাকে।

1990-এর দশকের গোড়ার দিকে VAX / VMS C সংকলক এর থেকে রিটার্ন মানটি ব্যাখ্যা করে না main(), এটি কেবল হোস্ট পরিবেশের জন্য যে কোনও মানই ফিরিয়ে দেয়। তবে আপনি যদি exit()এটি ব্যবহার করেন তবে মানটি যা প্রয়োজন তা করবে: সাফল্যের কোডে এবং জেনেরিক ব্যর্থতার কোডে অনুবাদ করুন EXIT_SUCCESS(বা 0) EXIT_FAILURE। ব্যবহার করতে EXIT_SUCCESS, আপনি ছিল এটা পাস করতে exit(), আপনার কাছ থেকে তা ফেরত না পারে main()। আমি জানি না যে এই সংকলকের আরও আধুনিক সংস্করণগুলি সেই আচরণটি সংরক্ষণ করেছিল কিনা।

এটি দেখতে দেখতে পোর্টেবল সি প্রোগ্রাম ব্যবহৃত হত:

#include <stdio.h>
#include <stdlib.h>

int main() {
  printf("Hello, World!\n");
  exit(EXIT_SUCCESS);  /* to get good return value to OS */
  /*NOTREACHED*/ /* to silence lint warning */
  return 0;  /* to silence compiler warning */
}

অন্যদিকে: আমি যদি সঠিকভাবে স্মরণ করি তবে প্রস্থান মূল্যগুলির জন্য ভিএমএস কনভেনশন বিজোড় / এমনকি এর চেয়ে বেশি সংখ্যক প্রয়োজন। এটি তীব্রতার স্তরের এনকোড করতে আসলে তিনটি বিটের মতো কিছু ব্যবহার করে। তবে সাধারণভাবে বলতে গেলে, বিজোড় তীব্রতার মাত্রা সাফল্য বা বিবিধ তথ্য এবং এমনকী ত্রুটিগুলি নির্দেশ করে।


কিছু পুরানো প্রাক ANSI কম্পাইলার মান চিকিত্সা হতে পারে returnedদ্বারা mainপ্রেরণ করা মান থেকে ভিন্নভাবে exit- কিন্তু মান বিশেষভাবে বলেন, "এর রিটার্ন টাইপ তাহলে mainফাংশন একটি টাইপ সঙ্গে সামঞ্জস্যপূর্ণ int, এর প্রাথমিক কল থেকে একটি ফিরতি mainফাংশন ফাংশনটিকে তার আর্গুমেন্ট হিসাবে exitফিরিয়ে দেওয়া মান দিয়ে কল করার সমতুল্য main। এটি সি 11; C89 / C90 প্রায় একই শব্দ ছিল।
কিথ থম্পসন

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

আপনি কি এটির জন্য একটি প্রশংসাপত্র আছে? একটি পৃথক সমস্যা হ'ল যে কোনও বর্তমান সংকলকগুলির সেই নির্দিষ্ট বাগ রয়েছে। আপনার উত্তরটি বর্তমান সময়ে বাক্যযুক্ত।
কিথ থম্পসন

এটি একটি ন্যায্য সমালোচনা। আমি যে নির্দিষ্ট ক্ষেত্রে জানি তার ক্ষেত্রে সুযোগটি সীমাবদ্ধ করার জন্য আমি শব্দটি পরিবর্তন করেছি।
অ্যাড্রিয়ান ম্যাককার্টি 21

0

সি থেকে ফিরে আসা একই মানের সাথে mainকল exitকরার অনুরূপ।

সি স্ট্যান্ডার্ডের 5.1.2.2.3 বিভাগে বলা হয়েছে:

যদি মূল ফাংশনের রিটার্ন টাইপ প্রকারের সাথে সামঞ্জস্যপূর্ণ হয় তবে প্রাথমিক কল থেকে মূল ফাংশনে প্রত্যাবর্তনটি মূল ফাংশন দ্বারা প্রদত্ত মানটিকে তার আর্গুমেন্ট হিসাবে ফিরিয়ে আনা প্রস্থান ফাংশনকে কল করার সমতুল্য ; 11) মূল ফাংশনটি শেষ করে এমন} এ পৌঁছনো 0 এর মান প্রদান করে the

অন্যান্য উত্তরে উল্লিখিত হিসাবে সি ++ এর নিয়মগুলি কিছুটা আলাদা।


-1

যখন আপনার ফাংশনটিকে একাধিকবার বলা হয় তখন আসলে exit(0)এবং এর return(0)মধ্যে একটি পার্থক্য থাকে ।mainmain

নিম্নলিখিত প্রোগ্রাম

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char** argv) {
  if (argc == 0)
    return(0);
  printf("%d", main(argc - 1, argv));
}

হিসাবে চালান

./program 0 0 0 0

নিম্নলিখিত ফলাফলের ফলাফল হবে:

00000

তবে এটি একটি:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char** argv) {
  if (argc == 0)
    exit(0);
  printf("%d", main(argc - 1, argv));
}

যুক্তি নির্বিশেষে কিছু মুদ্রণ করবে না।

আপনি যদি নিশ্চিত হন যে কেউ কখনও আপনার mainস্পষ্টভাবে কল করবেন না এটি প্রযুক্তিগতভাবে সাধারণভাবে কোনও বড় পার্থক্য নয়, তবে ক্লিয়ারার কোড বজায় রাখা exitআরও ভাল দেখায়। যদি আপনি কোনও কারণে কল করতে চান main- আপনার এটি আপনার প্রয়োজনের সাথে সামঞ্জস্য করা উচিত।

সি সম্পর্কে কথা বলছি

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