return statement เทียบกับ exit () ใน main ()


197

ฉันควรใช้exit()หรือเพียงแค่returnงบในmain()? โดยส่วนตัวแล้วฉันชอบreturnคำแถลงเพราะฉันรู้สึกว่ามันเหมือนกับการอ่านฟังก์ชั่นอื่น ๆ และการควบคุมการไหลเมื่อฉันอ่านรหัสนั้นราบรื่น (ในความคิดของฉัน) และแม้ว่าฉันต้องการที่จะ refactor main()ฟังก์ชั่นที่มีดูเหมือนจะเป็นทางเลือกที่ดีกว่าreturnexit()

มีexit()อะไรพิเศษที่returnทำไม่ได้เหรอ?

คำตอบ:


277

ที่จริงมีคือ ความแตกต่าง แต่มันลึกซึ้ง มันมีความหมายเพิ่มเติมสำหรับ C ++ แต่ความแตกต่างนั้นสำคัญ

เมื่อฉันโทรreturnเข้าไปmain()จะมีการเรียก destructors สำหรับวัตถุที่อยู่ภายในของฉัน ถ้าฉันเรียกexit()มันจะไม่มีการเรียกตัวทำลายสำหรับวัตถุที่อยู่ภายในของฉัน! อ่านอีกครั้งว่า ไม่ได้กลับexit() นั่นหมายความว่าเมื่อฉันเรียกมันว่ามี "ไม่มี backsies" วัตถุใด ๆ ที่คุณสร้างขึ้นในฟังก์ชั่นนั้นจะไม่ถูกทำลาย บ่อยครั้งที่สิ่งนี้ไม่มีความหมาย แต่บางครั้งมันก็เหมือนกับการปิดไฟล์

โปรดทราบว่าวัตถุที่จะได้รับการทำความสะอาดขึ้นแม้ว่าคุณจะเรียกstatic exit()สุดท้ายทราบว่าถ้าคุณใช้abort()วัตถุจะไม่ถูกทำลาย นั่นคือไม่มีวัตถุทั่วโลกไม่มีวัตถุคงที่และไม่มีวัตถุในท้องถิ่นจะมี destructors ของพวกเขาที่เรียกว่า

ดำเนินการต่อด้วยความระมัดระวังเมื่อให้ความสำคัญกับทางออกมากกว่าผลตอบแทน

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


1
abort () ออกโดยมีเงื่อนไขข้อผิดพลาด (รหัสทางออกที่ไม่ใช่ศูนย์) และอาจเป็นแกนกลาง หากคุณต้องการออกโดยไม่เรียกใช้ destructors แบบคงที่ให้ใช้ _exit

7
@ ไมค์: มีความแตกต่างระหว่างบัฟเฟอร์ไฟล์ไลบรารี C และวัตถุสตรีมไฟล์ C ++ exit () - เป็นส่วนหนึ่งของ C library - ได้รับการออกแบบมาเพื่อประสานงานกับและลบล้างอดีต แต่สามารถข้ามหลัง: แม้เนื้อหา c ++ fstream มาตรฐานไม่ได้ล้างไปยังดิสก์ (ลอง - ฉันทำมันล้มเหลวด้วย Linux / GCC) และประเภทที่ผู้ใช้กำหนดเองซึ่งบัฟเฟอร์ I / O ไม่สามารถคาดหวังได้ว่าจะล้างออกด้วยเช่นกัน
Tony Delroy

9
หมายเหตุ: ข้อความสั่ง: จะไม่มีการเรียกตัวทำลายสำหรับวัตถุที่อยู่ภายในเครื่องของฉัน! ไม่เป็นจริงอีกต่อไปสำหรับ C ++ 11: - วัตถุที่เกี่ยวข้องกับเธรดปัจจุบันที่มีระยะเวลาการจัดเก็บเธรดถูกทำลาย (C ++ 11 เท่านั้น) cplusplus.com/reference/cstdlib/exit
Ilendir

7
มันหมายถึงthread_localdestructors ของวัตถุจะถูกเรียก ตัวทำลายสำหรับวัตถุในพื้นที่อื่นยังไม่ถูกเรียกใช้ ideone.com/Y6Dh3f
HolyBlackCat

3
BTW และเป็นเรื่องอวดรู้และเนื่องจากคำตอบนี้อาจสร้างความสับสนให้กับผู้อ่านที่ใช้ C: สำหรับ C ปัญหาเกี่ยวกับการexit()ปิดไฟล์อย่างสมบูรณ์นั้นผิดจริง ข้อมูลเวลาเพียงอย่างเดียวอาจไม่ได้ถูกลบทิ้งในกรณีตรงข้าม: เช่นถ้ามีการใช้งานreturnจากmain()และมีการเรียกใช้setbuf()หรือsetvbuf()มีบัฟเฟอร์ที่ประกาศว่าเป็นหน่วยเก็บข้อมูลอัตโนมัติในmain()(ตามที่กล่าวไว้ในคำตอบของ R. ด้านล่าง) มันแย่มากจริง ๆ คำถามนี้ถูกแท็กด้วยทั้ง C และ C ++ (และสไตล์การเข้ารหัส - ไม่ใช่ปัญหาสไตล์!)
เกร็ก A. วูดส์

25

ข้อแตกต่าง: exitเป็นฟังก์ชั่นไลบรารีมาตรฐานดังนั้นคุณต้องรวมส่วนหัวและลิงก์กับไลบรารีมาตรฐาน เพื่อแสดง (ใน C ++) นี่เป็นโปรแกรมที่ถูกต้อง:

int main() { return 0; }

แต่หากต้องการใช้exitคุณจะต้องมี:

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

นอกจากนี้ยังเพิ่มข้อสมมติฐานเพิ่มเติม: การโทรexitจากmainนั้นมีผลข้างเคียงเช่นเดียวกับการคืนค่าศูนย์ ตามที่คนอื่น ๆ ได้ชี้ให้เห็นสิ่งนี้ขึ้นอยู่กับประเภทของไฟล์ที่คุณกำลังสร้าง (เช่นใครโทรมาmain) คุณเข้ารหัสแอปที่ใช้ C-runtime หรือไม่ ปลั๊กอินมายา บริการ Windows หรือไม่ คนขับรถ? กรณีที่แต่ละคนจะต้องมีการวิจัยเพื่อดูว่าจะเทียบเท่ากับexit returnIMHO ใช้exitเมื่อคุณหมายถึง returnเพียงทำให้รหัสสับสนมากขึ้น OTOH ถ้าคุณหมายความว่าจริง ๆ exitแล้วก็ให้ใช้มัน


16

มีเหตุผลอย่างน้อยหนึ่งจะชอบexit: ถ้าใด ๆ ของคุณatexitไสอ้างถึงข้อมูลอัตโนมัติการจัดเก็บข้อมูลระยะเวลาmainหรือถ้าคุณใช้setvbufหรือsetbufจะกำหนดให้เป็นหนึ่งในมาตรฐานลำธารอัตโนมัติจัดเก็บข้อมูลระยะเวลา buffer ในmainแล้วกลับมาจากการmainผลิต พฤติกรรมที่ไม่ได้กำหนด แต่การโทรexitนั้นถูกต้อง

อีกประการหนึ่งการใช้งานที่มีศักยภาพ (มักจะสงวนไว้สำหรับโปรแกรมของเล่นอย่างไร) เป็นเพื่อออกจากโปรแกรมที่มีสวด recursive mainของ


1
@Seb ไม่มีอะไรพิเศษเกี่ยวกับmain()- มันเป็นแค่ฟังก์ชั่นที่เหมือน ๆ กัน ในทางกลับกันเนื่องจากมีการกล่าวถึงเป็นพิเศษในมาตรฐานมาตรฐานจะต้องระมัดระวังอย่างเป็นธรรมเกี่ยวกับวิธีการกำหนดmain()และสิ่งที่ใกล้เคียงและที่รัก แต่ในท้ายที่สุดแม้ว่ามาตรฐานไม่ (และต้องไม่ ) main()จำเป็นต้องใช้คอมไพเลอร์จะทำพิเศษอะไรเกี่ยวกับการจัดเก็บข้อมูลอัตโนมัติใน โปรดอ่านFootnote # 11ด้านล่างย่อหน้าที่คุณอ้างถึงในความคิดเห็นของคุณ
เกร็ก A. วูดส์

1
@ GregA.Woods น่าสนใจ ดูเหมือนว่ามีข้อความเชิงบรรทัดฐานบางอย่างที่ขัดแย้งกับข้อความที่ให้ข้อมูลบางอย่าง ตามคำสั่งของ ISO / IECการอ้างอิงเชิงบรรทัดฐานถือว่าเป็น "ที่ขาดไม่ได้" โดยที่ - เนื่องจากข้อมูลถือเป็นข้อมูลเสริมเท่านั้น ... นอกจากนี้การใช้คำว่า "จะ" ในการถ่ายทอดความต้องการนั้นไม่ถูกต้อง ตามเอกสารข้างต้น (ภาคผนวก H) โดยสรุปข้อความที่ให้ข้อมูลไม่ถูกต้องอย่างแน่นอนที่สุด
ออทิสติก

2
@Seb: เห็นได้ชัดว่ามีเจตนาที่จะไม่แทนที่ข้อกำหนดเกี่ยวกับพฤติกรรมของการจัดเก็บอัตโนมัติและมีการเขียนเชิงอรรถเพื่อความชัดเจนในเรื่องนี้ ใช่มีความไม่แน่นอนถ้อยคำที่ไม่ดีในมาตรฐาน C ใครก็ตามที่ได้อ่านก็รู้เรื่องนี้ เรารู้ด้วยว่าโดยทั่วไปแล้วคณะกรรมการจะไม่แก้ไขปัญหาเช่นนี้เพราะเจตนาชัดเจนอยู่แล้ว
. GitHub หยุดช่วยน้ำแข็ง

1
@Seb: นี่ไม่ใช่การอภิปรายหรือคดีในศาลเพื่อพิสูจน์ว่าคุณถูกต้อง เป้าหมายควรได้รับความเข้าใจที่ชัดเจนในสิ่งที่ภาษา C จริง (ตามที่ตั้งใจและนำไปใช้) และแสดงให้เห็นว่าในคำตอบที่เป็นประโยชน์ต่อผู้อ่าน ข้อความเชิงบรรทัดฐานผิดอย่างละเอียด (ตรงกันข้ามกับความตั้งใจในสิ่งที่ควรจะแสดงออก) ในทางที่แก้ไขโดยเชิงอรรถ หากคุณไม่พอใจกับสิ่งนี้ให้ส่งรายงานข้อบกพร่อง แต่อย่าคาดหวังคำตอบ นั่นเป็นวิธีที่ WG14 กลิ้ง ...
.. GitHub หยุดช่วยน้ำแข็ง

3
@Seb: คุณดูเหมือนจะเชื่อว่าภาษา C สามารถเข้าใจได้โดยการตีความข้อความภาษาธรรมชาติของมาตรฐานราวกับว่ามันเข้มงวดอย่างสมบูรณ์ มันเป็นไปไม่ได้ ข้อมูลจำเพาะมีข้อผิดพลาดและ WG14 ไม่ต้องเสียเวลาเขียนสิ่งใหม่เมื่อเชิงอรรถง่ายอธิบายว่าพวกเขารู้แล้วว่าพวกเขาทำผิด แต่ผู้อ่านสามารถเข้าใจได้
. GitHub หยุดช่วยน้ำแข็ง

5

ฉันมักจะใช้returnเพราะต้นแบบมาตรฐานสำหรับmain()บอกว่ามันคืนค่าintบอกว่ามันไม่ได้ผลตอบแทน

ที่กล่าวว่ามาตรฐานบางเวอร์ชันให้mainการดูแลเป็นพิเศษและคิดว่ามันจะคืนค่า 0 หากไม่มีreturnคำสั่งชัดเจน รับรหัสต่อไปนี้:

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

G ++ เพียงสร้างคำเตือนfoo()และละเว้นการส่งคืนที่หายไปจากmain:

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

ผมไม่ทราบว่าเกี่ยวกับ C แต่ c ++ ระบุมาตรฐานที่ถ้าคุณไม่ได้กลับมาเป็นค่าในหลักก็สันนิษฐานว่าจะกลับ 0.
เจสันเบเกอร์

มันดูเหมือนกับว่า C99 เป็นเหมือนเดิม: faq.cprogramming.com/cgi-bin/...
เจสันเบเกอร์

2
C99 และ C ++ คืนค่า 0 หากไม่มีคำสั่งส่งคืน C90 จะไม่ส่งคืน
d0k

เพียงเพราะฟังก์ชั่นถูกประกาศว่ามีค่าตอบแทนไม่ได้หมายความว่าคุณต้องใช้returnเพื่อยุติการดำเนินการ การโทรexit()ก็เป็นวิธีที่ถูกต้องและบางครั้งก็มีความจำเป็นในการสิ้นสุดการดำเนินการของฟังก์ชั่นใด ๆ ตามที่ฉันและคนอื่น ๆ ได้อธิบายไว้ที่อื่นการโทรexit()แม้จากการmain()บ่งบอกถึงความตั้งใจที่ชัดเจนยิ่งขึ้นในการออกจากกระบวนการทั้งหมดรักษาที่เก็บข้อมูลอัตโนมัติจนกระทั่งกระบวนการออกและทำให้การบำรุงรักษาง่ายขึ้นระหว่างการสร้างรหัสในอนาคต สำหรับการใช้ C returnในmain()เมื่อเจตนาคือการสิ้นสุดกระบวนการจึงถือเป็นการปฏิบัติที่ไม่ดี
Greg A. Woods

@ GregA.Woods เป็นความคิดเห็นของคุณ แต่แทบจะไม่ได้รับการโหวต! สิ่งที่ฉันเขียนด้านบนนั้นสอดคล้องกับมาตรฐานอย่างสมบูรณ์ในขณะที่ข้อโต้แย้งของคุณเป็นเพียงความหมาย
Alnitak

5

ฉันสองความคิดเห็นอย่างรุนแรงโดย R เกี่ยวกับการใช้ exit () เพื่อหลีกเลี่ยงการเก็บข้อมูลอัตโนมัติในการmain()เรียกคืนก่อนที่โปรแกรมจะสิ้นสุด return X;คำสั่งmain()ไม่ได้อย่างแม่นยำเทียบเท่ากับการโทรไปexit(X);ตั้งแต่การจัดเก็บข้อมูลแบบไดนามิกของmain()หายเมื่อmain()ผลตอบแทน แต่มันก็ไม่ได้หายไปถ้ามีการเรียกร้องให้exit()ทำแทน

นอกจากนี้ใน C หรือ C-เช่นภาษาใด ๆreturnคำสั่งขอคำแนะนำให้ผู้อ่านว่าการดำเนินการจะดำเนินการต่อในฟังก์ชั่นการโทรและในขณะที่ความต่อเนื่องของการดำเนินการนี้มักจะเป็นจริงในทางเทคนิคถ้าคุณนับกิจวัตรประจำวันเริ่มต้น C ซึ่งเรียกว่าmain()ฟังก์ชั่นก็ไม่ได้ สิ่งที่คุณหมายถึงเมื่อคุณต้องการที่จะจบกระบวนการ

หลังจากที่ทุกคนถ้าคุณต้องการที่จะจบโปรแกรมของคุณจากภายในฟังก์ชั่นอื่น ๆ ยกเว้นmain()คุณจะต้องexit()เรียก การทำเช่นนี้อย่างสม่ำเสมอmain()ทำให้โค้ดของคุณสามารถอ่านได้ง่ายขึ้นและมันก็ทำให้ทุกคนง่ายขึ้นในการคำนวณรหัสของคุณอีกครั้ง เช่นรหัสที่คัดลอกจากmain()ไปยังฟังก์ชั่นอื่น ๆ จะไม่ทำงานผิดปกติเนื่องจากreturnคำสั่งที่ไม่ได้ตั้งใจซึ่งควรจะถูกexit()เรียก

ดังนั้นการรวมทุกจุดเหล่านี้ร่วมกันสรุปก็คือว่ามันเป็นนิสัยที่ไม่ดีอย่างน้อยสำหรับ C, การใช้คำสั่งที่จะจบโปรแกรมในreturnmain()


คุณอาจพบ5.1.2.2.3p1 ของมาตรฐาน C ที่น่าสนใจ ...
ออทิสติก

คำตอบนี้ควรพิจารณาอย่างรอบคอบสำหรับโปรแกรม C ตามที่ระบุไว้ในบริบทของคำตอบ สำหรับการใช้กับ C ++ จะต้องมีการชั่งน้ำหนักอย่างระมัดระวังเทียบกับ caveats ที่กล่าวถึงก่อนหน้าทั้งหมด สำหรับ C ++ ฉันขอแนะนำให้หลีกเลี่ยงexit()โดยทั่วไป แต่อย่าใช้หาก a throwหรือabort()ทางเลือกอื่นไม่ทำงานในบริบทที่เฉพาะเจาะจง แต่โดยเฉพาะอย่างยิ่งหลีกเลี่ยงexit()ในหลักและใช้ผลตอบแทนในหลักแทนการปฏิบัติทั่วไป
Eljay

5

exit () ทำสิ่งใดเป็นพิเศษหรือไม่ที่ "คืน" ไม่ได้?

สำหรับคอมไพเลอร์บางตัวสำหรับแพลตฟอร์มที่ไม่ธรรมดาexit()อาจแปลอาร์กิวเมนต์เป็นค่าการออกของโปรแกรมของคุณในขณะที่การส่งคืนจากmain()อาจส่งผ่านค่าโดยตรงไปยังสภาพแวดล้อมโฮสต์โดยไม่มีการแปลใด ๆ

มาตรฐานจำเป็นต้องมีพฤติกรรมที่เหมือนกันในกรณีเหล่านี้ (โดยเฉพาะมันบอกว่าคืนสิ่งที่intเข้ากันได้จากmain()ควรจะเทียบเท่ากับการโทรexit()ด้วยค่านั้น) ปัญหาคือระบบปฏิบัติการที่แตกต่างกันมีข้อกำหนดที่แตกต่างกันสำหรับการตีความค่าออก ในหลาย ๆ ระบบ (MANY!) 0 หมายถึงความสำเร็จและสิ่งอื่นใดคือความล้มเหลว แต่ในการพูด VMS ค่าแปลกหมายถึงความสำเร็จและแม้กระทั่งคนหมายถึงความล้มเหลว หากคุณคืนค่า 0 จากmain()ผู้ใช้ VMS จะเห็นข้อความที่น่ารังเกียจเกี่ยวกับการละเมิดการเข้าถึง ไม่มีการละเมิดการเข้าถึง - นั่นเป็นเพียงข้อความมาตรฐานที่เกี่ยวข้องกับรหัสความล้มเหลว 0

จากนั้น ANSI ก็เข้ามาและอวยพรEXIT_SUCCESSและEXIT_FAILUREเป็นข้อโต้แย้งที่คุณสามารถส่งผ่านไปexit()ได้ มาตรฐานก็บอกว่าexit(0)ควรประพฤติเหมือนกันexit(EXIT_SUCCESS)ดังนั้นการใช้งานส่วนใหญ่กำหนดไปEXIT_SUCCESS0

ดังนั้นมาตรฐานทำให้คุณผูกกับ VMS เนื่องจากไม่มีวิธีมาตรฐานในการส่งคืนรหัสความล้มเหลวที่เกิดขึ้นเพื่อให้มีค่า 0

คอมไพเลอร์ในช่วงต้นทศวรรษที่ 1990 VAX / VMS C จึงไม่ได้ตีความค่าตอบแทนจากการmain()คืนค่า แต่ถ้าคุณใช้exit()มันจะทำสิ่งที่มาตรฐานที่ต้องการ: แปลEXIT_SUCCESS(หรือ0) ลงในรหัสที่ประสบความสำเร็จและEXIT_FAILUREเป็นรหัสความล้มเหลวทั่วไป กับการใช้งานEXIT_SUCCESSคุณมีที่จะผ่านมันไปคุณจะไม่สามารถกลับมาได้จากexit() main()ฉันไม่ทราบว่าคอมไพเลอร์รุ่นที่ทันสมัยกว่านี้รักษาพฤติกรรมนั้นไว้หรือไม่

โปรแกรม C พกพาที่ใช้ในลักษณะนี้:

#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 */
}

นอกเหนือ: ถ้าฉันจำได้อย่างถูกต้องอนุสัญญา VMS สำหรับค่าทางออกนั้นมีความเหมาะสมมากกว่าคี่ / คู่ จริง ๆ แล้วมันใช้บางอย่างเช่นบิตต่ำสามบิตเพื่อเข้ารหัสระดับความรุนแรง อย่างไรก็ตามโดยทั่วไปการพูดระดับความรุนแรงคี่บ่งชี้ความสำเร็จหรือข้อมูลเบ็ดเตล็ด


คอมไพเลอร์ pre-ANSI เก่าบางตัวอาจปฏิบัติต่อค่าreturnedโดยmainแตกต่างจากค่าที่ส่งไปยังexit- แต่มาตรฐานระบุไว้โดยเฉพาะว่า "ถ้าประเภทการคืนของmainฟังก์ชันเป็นชนิดที่เข้ากันได้กับintการส่งคืนจากการเรียกครั้งแรกไปยังmainฟังก์ชันคือ เทียบเท่ากับการเรียกexitฟังก์ชันที่มีค่าที่ส่งคืนโดยmainฟังก์ชันเป็นอาร์กิวเมนต์ " นั่นคือ C11; C89 / C90 มีข้อความเกือบเหมือนกัน
Keith Thompson

จริง อย่างไรก็ตามคอมไพเลอร์ยุค ANSI บางส่วนไม่ได้รับสิทธิ์นี้และจำเป็นต้องใช้การออกอย่างชัดเจนเพื่อรับค่าส่งคืนที่ถูกต้องกลับสู่สภาพแวดล้อมโฮสต์ เนื่องจากมาตรฐาน (ถึงตอนนั้น) ต้องการให้ 0 ได้รับการปฏิบัติเหมือนEXIT_SUCCESSไม่มีทางที่จะคืนสถานะความล้มเหลวเฉพาะแพลตฟอร์มที่มีค่า 0 ซึ่งอาจเป็นสาเหตุว่าทำไมคอมไพเลอร์บางส่วนของยุคนั้นจึงกลับมาจากหลัก และexit()แตกต่างกัน
Adrian McCarthy

คุณมีหนังเรื่องนี้ไหม? ปัญหาแยกต่างหากคือคอมไพเลอร์ปัจจุบันมีข้อผิดพลาดนั้นหรือไม่ คำตอบของคุณสำหรับการใช้ถ้อยคำในกาลปัจจุบัน
Keith Thompson

นั่นเป็นการวิจารณ์ที่ยุติธรรม ฉันเปลี่ยนถ้อยคำเพื่อ จำกัด ขอบเขตให้เป็นกรณีเฉพาะที่ฉันรู้
Adrian McCarthy

0

ใน C ที่ส่งคืนจากmainจะเหมือนกับการโทรexitด้วยค่าเดียวกันทั้งหมด

ส่วน 5.1.2.2.3 ของสถานะมาตรฐาน C :

หากประเภทการกลับมาของฟังก์ชั่นหลักเป็นชนิดที่เข้ากันได้กับ int, ผลตอบแทนจากการโทรเริ่มต้นไปยังฟังก์ชั่นหลักคือเทียบเท่ากับการเรียกฟังก์ชั่นทางออกที่มีค่าส่งกลับโดยหน้าที่หลักเป็นอาร์กิวเมนต์ ; 11) การเข้าถึง} ที่ยุติฟังก์ชั่นหลักส่งคืนค่า 0 หากประเภทการส่งคืนไม่เข้ากันกับ int สถานะการเลิกจ้างที่ส่งคืนไปยังสภาพแวดล้อมโฮสต์จะไม่ได้รับการระบุ

กฎสำหรับ C ++ นั้นแตกต่างกันเล็กน้อยตามที่ระบุไว้ในคำตอบอื่น ๆ


-1

จริงๆแล้วมีความแตกต่างระหว่างexit(0)และreturn(0)ในmain- เมื่อmainฟังก์ชั่นของคุณถูกเรียกหลายครั้ง

โปรแกรมต่อไปนี้

#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คุณควรปรับให้เข้ากับความต้องการของคุณ

พูดเกี่ยวกับ C.

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.