Exit Và Return??? [Archive] - Diễn Đàn Tin Học
Có thể bạn quan tâm
Diễn Đàn Tin Học > Lập trình > Các ngôn ngữ lập trình > C/C++ > Exit và return??? PDA
View Full Version : Exit và return???
khigia0913-08-2009, 18:49Cho em hỏi. Trong C có lệnh exit hem.?? Sao em đọc trong cuốn sách kia tự nhiên thấy có exit(1);, hình như nó đc. dùng như return à. Vậy exit và return giống và khác nhau điểm nào. Vậy exit(1), exit(99), exit(98) là có ý nghĩa gì đặc biệt hem??? Thanks for comment. ^^ quangtq13-08-2009, 19:44Hình như có. Nhưng trong header nào mình cũng ko nhớ. Đại loại là exit(code) là thoát khỏi hàm hoặc main với mã là code. Còn return (result) thì nếu có result thì thoát khỏi hàm và trả về kq là result, nếu là return ; thì tương đương exit thôi. Hok bik zì13-08-2009, 21:09Cả về cơ chế hoạt động và phạm vi ngữ cảnh thì return và exit khác nhau hoàn toàn. Nếu sử dụng trong một hàm thì return sẽ break khỏi hàm và trở về nơi gọi. Còn exit sẽ break cả chương trình. Khi sử dụng return thì các đối tượng trong block gọi return sẽ được gọi destructor, còn exit thì không. khigia0914-08-2009, 09:03Vậy cho em hỏi thêm 1 cái. Nếu mà exit(code) như anh quan nói thế. Vậy exit(1) có nghĩa gì, exit(2) là gì, exit(99) là sao, exit(xyz) thì sao, nó có khác nhau không, hay toàn bộ tụi nó chỉ làm 1 nhiệm vụ là thoát khỏi chương trình luôn Hok bik zì14-08-2009, 09:15Số nào cũng được, tuy nhiên người ta hay sử dụng 0. Nhưng tốt nhất là sử dụng const EXIT_SUCCESS và EXIT_FAILURE dq_ninh14-08-2009, 12:26Khi sử dụng return thì các đối tượng trong block gọi return sẽ được gọi destructor, còn exit thì không. Không đúng đâu bạn ơi. Exit() dùng để thoát ra khỏi một process (tức là một chương trình) và đưa cái exit code cho operating system. Exit là một hàm để thoát bình thường (normal exit), và tất cả các hàm huỷ (destructors) đều được gọi bình thường trước khi chương trình đóng lại. Đây là reference của hàm Exit Terminate calling process Terminates the process normally, performing the regular cleanup for terminating processes. First, all functions registered by calls to atexit are executed in the reverse order of their registration. Then, all streams are closed and the temporary files deleted, and finally the control is returned to the host environment. The status argument is returned to the host environment. Parameters status Status value returned to the parent process. Generally, a return value of 0 or EXIT_SUCCESS indicates success, and any other value or the constant EXIT_FAILURE is used to indicate an error or some kind of abnormal program termination Bây giờ, ít phần mềm nào còn dùng Exit(n) với n parameter để trả exit code về cho OS. Nhưng ngày xưa, vào cái thời hoàng kim của DOS, thì hầu như tất cả các phần mềm thường dùng tới. Lý do chính là ngày xưa, một hệ thống phần mềm thường được chia ra làm nhiều chương trình nhỏ, và người ta dùng một .BAT file để hiển thị menu. Khi phần mềm phát hiện một lỗi cần phải thoát ra, thì nó trả exit code về cho OS. OS cho .BAT biết, và .BAT file sẽ hiển thị lỗi lên cho NXD biết. Trong những cấu trình của các thư viện của MS, họ vẫn dùng Exit(n) để trả lỗi về cho OS mỗi khi buộc phải chấm dứt ...không bình thường. Và mỗi lần như thế, nếu bạn vào window event log, bạn sẽ thấy một log message với exit code. Hok bik zì14-08-2009, 13:25Đúng hay không thì cứ làm một bài quick test là biết :) #include <iostream> class Testing { public: Testing() { std::cout << "Constructor" << std::endl; } ~Testing() { std::cout << "Destructor" << std::endl; } }; int main() { Testing myTesting; //return 0; exit(EXIT_SUCCESS); } dq_ninh14-08-2009, 15:49Đúng hay không thì cứ làm một bài quick test là biết :) #include <iostream> class Testing { public: Testing() { std::cout << "Constructor" << std::endl; } ~Testing() { std::cout << "Destructor" << std::endl; } }; int main() { Testing myTesting; //return 0; exit(EXIT_SUCCESS); } Đúng hay không thì cứ làm một bài quick test là biết Làm gì hùng hổ dữ vậy? ;-) Nhưng quả nhiên là sinh viên giỏi! Không hổ danh của trường. Nhưng có điều, chắc thầy còn giâú nghề, không chịu truyền thụ hết (hehehe). Ngày mai vào trường nhớ bắt thầy dẫn đi ăn kem vì cái tội giấu nghề. Với cái thí dụ bạn đưa ra, dĩ nhiên là exit() không có gọi destructor rồi, biết tại sao không? Tại vì myTesting của bạn là một automate object. Nói một cách giản dị dễ hiểu hơn, là nó là một biến từ..nội địa (local variable). Và bởi vì nội địa, cả cái object của nó tự động bị xóa bỏ khi thoát khỏi body của main. Xin bạn cũng vui lòng thử lại cái code này, được sửa lại như sau: #include <iostream> class Testing { public: Testing() { std::cout << "Constructor" << std::endl; } ~Testing() { std::cout << "Destructor" << std::endl; } }; Testing myTesting; int main() { static Testing myTesting2; //return 0; exit(EXIT_SUCCESS); } Để thấy destructor của Testing object được gọi hai lần. Hok bik zì14-08-2009, 16:25Hảo cao thủ ! :D Thực sự là không nghĩ đến vấn đề local variable. Kiến thức hạn hẹp vãn bối xin thua ! lol khigia0914-08-2009, 21:58Hix, toàn những điều mới biết... Mà cho em hỏi cái :) Sao copy code của mấy anh về test coi thử thì nó báo lỗi không chạy kìa ;)) Để thấy destructor của Testing object được gọi hai lần. --> Làm sao thấy đc. cái này thế :), bằng cách nào, nhìn bằng mắt à :) Thật tình là không biết, chỉ em i ^^ dq_ninh15-08-2009, 00:42Hảo cao thủ ! :D Thực sự là không nghĩ đến vấn đề local variable. Kiến thức hạn hẹp vãn bối xin thua ! lol Không hẹp hòi đâu! Ngược lại, giỏi giỏi lắm :-) trytolive16-08-2009, 20:52Với cái thí dụ bạn đưa ra, dĩ nhiên là exit() không có gọi destructor rồi, biết tại sao không? Tại vì myTesting của bạn là một automate object. Nói một cách giản dị dễ hiểu hơn, là nó là một biến từ..nội địa (local variable). Và bởi vì nội địa, cả cái object của nó tự động bị xóa bỏ khi thoát khỏi body của main. Bác này có thể giải thích rõ hơn không. Tại sao 1 biến automatic như vậy lại ko đc gọi destructor. "cả cái object của nó tự động bị xóa bỏ khi thoát khỏi body của main" -> 1 object trước khi bị xóa sẽ tự động gọi destructor mà, nếu ko gọi destructor thì nó bị xóa kiểu gì? Vả lại như vậy hàm exit là ko tốt, nếu nó ko gọi destructor như vầy thì lúc mình cần free bộ nhớ thì nó lại ko làm cho mình. Còn đối với biến global và static kia, sao lại được gọi destructor, giải thích dùm em với. huhu. xistem16-08-2009, 21:57Code: #include <iostream> class Testing { public: Testing() { std::cout << "Constructor" << std::endl; } ~Testing() { std::cout << "Destructor" << std::endl; } }; Testing myTesting; int main() { static Testing myTesting2; //return 0; exit(EXIT_SUCCESS); } Để thấy destructor của Testing object được gọi hai lần. __________________ Sorr bà con,mình test thử thấy destructor chỉ call 1 lần duy nhất do biến Static myTesting2 mà thôi, giải thích cụ thể lại ý tưởng trên jum cại Search trên mạng được cái này,hy vọng giúp ích : -4- Calling the function void exit(int); declared in <cstdlib> (lib.support.start.term) terminates the program without leaving the current block and hence without destroying any objects with automatic storage duration (class.dtor). If exit is called to end a program during the destruction of an object with static storage duration, the program has undefined behavior. -5- A return statement in main has the effect of leaving the main function (destroying any objects with automatic storage duration) and calling exit with the return value as the argument. If control reaches the end of main without encountering a return statement, the effect is that of executing return 0; Đại ý là khi call exit(int); thì program thoát ngay lập tức, nhưng con trỏ vẫn ở giữ tại current block (các bạn tưởng tượng khi call chương trình thì phải có 2 pointer nắm 2 đầu chương trình,nếu call return thì dựa vào 2 pointer đó sẽ biết vùng nhớ cần giải phóng,đồng thời xóa pointer đi; còn call exit() thì chúng ta chỉ thoát mà không giải phóng,tức là pointer không mất đi). dq_ninh17-08-2009, 02:01Bác này có thể giải thích rõ hơn không. Tại sao 1 biến automatic như vậy lại ko đc gọi destructor. "cả cái object của nó tự động bị xóa bỏ khi thoát khỏi body của main" -> 1 object trước khi bị xóa sẽ tự động gọi destructor mà, nếu ko gọi destructor thì nó bị xóa kiểu gì? Vả lại như vậy hàm exit là ko tốt, nếu nó ko gọi destructor như vầy thì lúc mình cần free bộ nhớ thì nó lại ko làm cho mình. Còn đối với biến global và static kia, sao lại được gọi destructor, giải thích dùm em với. huhu. Muốn hiểu cái này cho thật rõ ràng, có lẽ bạn cần phải hiểu về memory management của C/C++ trên Windơws OS. Bạn có thể google dùng Heap memory and stack memory. Tuy nhiên, nói một cách vắn tắt, khi một chương trình C/C++ chạy trên Windows, thì có hai loại memories: Stack memory và Heap memory. Heap memory lại được chia ra làm 3 phần: Global heap, local heap, và...heap. (ngoài ra còn có far-memory - nhưng cái này không nằm trong khuôn khổ hạn hẹp của mục này). Trong một C/C++ program, tất cả những automate objects (biến từ nội) đều được chứa trong stack memory chung một chỗ với con trỏ của hàm. Thí dụ như sau( 'x' là những automate objects): Hàm1 hàm2 hàm3 |1|x|x|x|x|x|x|x|x|x|x|x|2|x|x|x|x|x|x|x|x|x|3|x|x |x|x|x|x|x|x|x|x|x| Như đồ họa trên, khi hàm 3 thoát ra, thì tất cả những biến tù nội (automate objects) và còn trỏ của hàm đều được kéo (pop) ra khỏi stack memory. Do thế, khi dùng hàm exit() tại hàm3, thì tất cả stack memory từ hàm 1 đến hàm 3 đều bị xóa bỏ ngay lập tức. Và cũng vì như thế, nếu một object được tạo ở trong hàm, nó cũng bị xóa bỏ lập tức. Và bởi vì nó bị xoá bỏ lập tức, thì làm sao còn có thể gọi hàm huỷ của nó được nữa. Ngược lại, nếu một object được tạo lên theo dạng static và global, thì nó không nằm ở stack memory, mà nằm ở local/global heap memory. Do đó, nó vẫn còn tồn tại, và hàm huỷ của nó sẽ được gọi. Dĩ nhiên là exit() là một hàm...nguy hiểm và nên được dùng một cách tối cẩn thận. Như tôi đã trình bày trong bài trước, người ta thường dùng hàm này 20 năm về trước (khi chưa có throw, try, và catch), nhưng bây giờ ít ai dùng tới. Một chương trình C/C++ hiện tại, có thể dùng throw để ném lỗi về. Ở hàm main() hoặc winMain(), lỗi sẽ được bắt(catch), và chương trình có thể thoát an toàn dùng return(). chip hôi17-08-2009, 17:24Nếu bạn đã học qua Pascal thì sẽ thấy có sự tương tự: - return (C)_== exit (Pascal): Tức là thoát ra khỏi một chương trình con. Nếu là hàm thì cần phải return ra giá trị, còn thủ tục thì chỉ cần viết return thôi. - exit(number) (C) == halt (Pascal): Tức là dừng chương trình ngay tại thời điểm đó. Nếu bạn làm việc nhiều với file thì thao tác này thường xuyên được sử dụng. Khi một file không tồn tại thì ta sử dụng exit(0) để chấm dứt chương trình thay vì một thông báo lỗi của trình biên dịch (Khi đó file cần đọc của chúng ta sẽ mất mát dữ liệu - Tất nhiên là sử dụng cái này nhiều lần). thuongshoo20-08-2009, 11:22mình cũng đồng ý với anh dq_ninh. ct giờ hiện đại lắm! nếu bị lỗi thì thậm chí bản thân nó tạo ra file dump(crash) và nhờ người dùng gởi về trung tâm để xử lý luôn! nếu mình đơn giản dùng exit thì khó! phải catch để throw. Dĩ nhiên, nếu như vậy thì hàm thông báo lỗi mình viết 1 hàm chuyên thông báo lỗi. Làm vậy thì quy trình phát triển phần mềm sẽ ok hơn. khaplienhoa20-08-2009, 14:07Lâu lắm rồi trong box C/C++ mới có một bài đáng để viết. Và cũng vì như thế, nếu một object được tạo ở trong hàm, nó cũng bị xóa bỏ lập tức. Và bởi vì nó bị xoá bỏ lập tức, thì làm sao còn có thể gọi hàm huỷ của nó được nữa.Những dẫn giải của dq_ninh đã rất chính xác và rõ ràng, nhưng tôi trộm nghĩ statement trên của bạn sẽ khó hiểu đối với một người mới học. Tôi xin được lý giải một chút về vấn đề này dưới con mắt của tín đồ C và Assembly. 1. Vấn đề của chúng ta là vì sao Khi sử dụng return thì các đối tượng trong block gọi return sẽ được gọi destructor, còn exit thì không.như bạn Hok bik zì đã nói. Câu trả lời rất đơn giản, vì return là một keyword, còn exit là một function. Tại sao lại có sự khác nhau này? C++ compiler khi biên dịch keyword return, nó sẽ tìm hiểu xem trong block hay function có local variable (nằm trong stack memory) nào có data type là class, nếu có nó sẽ gọi destructors cho những varaibles đó, nếu có. Đây là công việc của C++ compiler trong compiling-time. Khi C++ compiler biên dịch gặp exit(x), nó biên dịch như một function bình thường, nghĩa là có push memory chunk hiện tại vào stack và call function mà không tự động thêm những statements để gọi destructors như trên. Trong exit() này có một statement đặc biệt để pop tất cả các memory chunks ra khỏi stack, như bạn dq_ninh đã nói Do thế, khi dùng hàm exit() tại hàm3, thì tất cả stack memory từ hàm 1 đến hàm 3 đều bị xóa bỏ ngay lập tức.đương nhiên nó không quan tâm đến variables nằm trong memory chunks là data type nào, có phải class hay không để gọi destructor. Thực tế là không thể biết để gọi destructor vì exit() được executed lúc running-time. 2. Còn vì sao static và global variables lại được gọi destructors. Vì nó không nằm trong stack memory, và mỗi variable là duy nhất trong chương trình, nên C++ trong giai đoạn compiling-time có thể nhận biết và tự động thêm statements trong lúc compiling để khi chương trình chạy destructors sẽ được gọi trước khi kết thúc hoàn toàn chương trình. ff871115-12-2009, 05:17Không đúng đâu bạn ơi. Exit() dùng để thoát ra khỏi một process (tức là một chương trình) và đưa cái exit code cho operating system. Exit là một hàm để thoát bình thường (normal exit), và tất cả các hàm huỷ (destructors) đều được gọi bình thường trước khi chương trình đóng lại. Đây là reference của hàm Exit Bây giờ, ít phần mềm nào còn dùng Exit(n) với n parameter để trả exit code về cho OS. Nhưng ngày xưa, vào cái thời hoàng kim của DOS, thì hầu như tất cả các phần mềm thường dùng tới. Lý do chính là ngày xưa, một hệ thống phần mềm thường được chia ra làm nhiều chương trình nhỏ, và người ta dùng một .BAT file để hiển thị menu. Khi phần mềm phát hiện một lỗi cần phải thoát ra, thì nó trả exit code về cho OS. OS cho .BAT biết, và .BAT file sẽ hiển thị lỗi lên cho NXD biết. Trong những cấu trình của các thư viện của MS, họ vẫn dùng Exit(n) để trả lỗi về cho OS mỗi khi buộc phải chấm dứt ...không bình thường. Và mỗi lần như thế, nếu bạn vào window event log, bạn sẽ thấy một log message với exit code. Chỉ biết nói 2 từ "Vãi đáy" .Quả là khâm phục nội công thâm thâm hậu của bác.Đúng là không có gì thú vị bằng nền tảng cơ bản Powered by vBulletin® Version 4.2.0 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.Từ khóa » Exit Là Gì Trong Tin Học
-
Lệnh Exit Trong Windows
-
Exit Là Gì? Định Nghĩa, Ví Dụ, Giải Thích - Sổ Tay Doanh Trí
-
1.Lệnh File →Exit Có Nghĩa Là Gì? 2. Mở Hộp Thoại Save As, Ta ...
-
EXIT Là Gì? -định Nghĩa EXIT | Viết Tắt Finder
-
EXIT Là Gì? - Khóa Học đấu Thầu
-
1.Lệnh File →Exit Có Nghĩa Là Gì? 2. Mở Hộp Thoại Save As, Ta Chọn ...
-
Một Số Câu Lệnh Kết Thúc Sớm Vòng Lặp Hoặc Chương Trình
-
Lệnh Exit Trong Visual Basic - Freetuts
-
Nút Nhấn Exit Là Gì? Những điều Cần Biết Về Nút ấn - VietnamSmart
-
EXIT Là Gì? -định Nghĩa EXIT - Blog Chia Sẻ AZ
-
Hỏi Về Sự Khác Nhau Giữa End Và Exit Sub