Xin được hỏi thêm câu thứ 4:
Viết exit( 0 ) và return 0 ở cuối hàm main thì khác nhau thế nào?
Thanks a lot :-D
Gần đây có một vài bạn hỏi có hỏi Dr là:
Hôm nay Dr tổng hợp tại đây trả lời các bạn luôn một thể:1. Tại sao khi biên dịch chương trình, tôi thấy có cảnh báo là "function should return a value". Điều đó có nghĩa lý gì?
2. Dòng lệnh return 0 ở cuối hàm main() có tác dụng gì?
3. Khai báo int main() và khai báo main() cái nào tốt hơn?
Bạn có lẽ cũng đã để ý rằng trong các chương trình C và C++, hàm main() được viết có dạng là:
hoặc là:C Code:
int main() { // ... }
Điều này có nghĩa rằng ở cuối của hàm main(), chúng ta hiểu là phải cho nó trả về một giá trị kiểu int, thường thường sẽ thấy là:C Code:
int main(int argc, char* argv[]) { // ... }
return 0;
Trước khi tiếp tục, câu hỏi này được gác lại và đề cập một chút đến 2 function prototype được viết sau đây, cả 2 trả về cùng một kiểu là kiểu int. Đó là:
và
func();2 khai báo hàm này có ý nghĩa giống nhau. Như vậy, ý tưởng tốt cho chương trình thì ta luôn luôn sử dụng mẫu thứ 2, bởi vì nó được khai báo kiểu trả về rõ ràng và bớt đi sự nhầm lẫn với người đọc. Lý do tại sao tôi nói ra ngoài một chút là vì nó thường được thấy trong các chương trình cũ, đặc biệt là đối với hàm main().
int func();
Bạn chắc cũng đã biết để chỉ ra một function không trả về giá trị nào cả, sử dụng từ khóa void để thay thế chứ không phải là func();
Khi một function được khai báo để trả về một giá trị nào đó, thực sự function đó nên trả về một giá trị. Nếu không, lời gọi hàm sẽ lấy một giá trị ngẫu nhiên không xác định nào đó, điều đó rõ ràng là không tốt cho chương trình của bạn. Điều này dẫn đến việc: Tại sao các compiler C và C++ thường cho ta các cảnh báo(warnings) khi bạn quên xây dựng giá trị trả về cho hàm khi hàm được khai báo trả về một kiểu nào đó.
void func();
Trở lại câu hỏi: Tại sao chúng ta sử dụng return 0, hoặc return một giá trị nào đó ở cuối hàm main()?
Câu trả lời đơn giản là: phần lớn trường hợp, nó không cần thiết lắm!
Nhưng nếu bạn có hứng thú với câu hỏi này thì quan tâm tới ý nghĩa sâu xa của nó một chút nhé:
Việc trả về một giá trị cho hàm main, tức là chương trình của bạn sẽ nói với Hệ Điều Hành về tình trạng chương trình của bạn, chẳng hạn chương trình của bạn khi chạy bên trong một lỗi nào đó.
Theo ngầm định của HĐH, khi giá trị 0 được trả về từ hàm main(), chương trình sẽ không bao giờ bắt gặp bất cứ một lỗi nào. Ngược lại, khi một giá trị khác không được trả về cho hàm main, nó sẽ báo hiệu rằng một lỗi đã được xảy ra.
Ví dụ, chương trình không thể mở một file mà đã được chỉ ra bởi một dòng lệnh. Các giá trị thực được trả về từ chương trình và ý nghĩa của chúng chỉ ra cho chương trình là: chúng đã được định nghĩa bởi programmer của chương trình đó.
Một minh họa với chương trình C gồm các đoạn lệnh mà các giá trị trả về là khác không:
Nếu bạn biết một chương trình C hoặc C++ có gọi các chương trình khác và bạn muốn truy lục giá trị trả về của nó bạn có thể làm như sau:C Code:
int main() { FILE* hinfile; FILE* houtfile; return 1; } return 2; } // ... return 0; }
Đối với shell scripts trên hệ thống Unix và Linux, giá trị trả về có thể lấy lại để sử dụng cho biến $?. Ví dụ:C Code:
int ret;
Trên hệ thống MS-DOS và Windows, bạn có thể lấy giá trị trả về thông qua IF ERRORLEVEL command. Một ví dụ trên MS-DOS với file batch (.bat):Bash Code:
#! /bin/bash prog # call your program if (($? != 0)); then echo The program ran into an error. fi
Tuy nhiên, cần lưu ý rằng trong tất cả các hệ thống, giá trị trả về có thể lấy lại được ngay sau khi chương trình được gọi. Việc này là vì giá trị $? hoặc ERRORLEVEL sẽ ghi đè lên mỗi lần chương trình được gọi.Code:@echo off prog if errorlevel 1 echo The program ran into an error.
Nếu có gì còn thiếu xót mong các bạn bổ sung thêm nhé!
Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó.Email: kevin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
Phone: 0972 89 7667
Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp hoặc bị sự thiếu kỷ luật làm tiêu tan sự nghiệp.
Xin được hỏi thêm câu thứ 4:
Viết exit( 0 ) và return 0 ở cuối hàm main thì khác nhau thế nào?
Thanks a lot :-D
www.svbkol.org <-- Diễn đàn của SV Đại học Bách Khoa Hà Nội. You are welcome!!!
OK! Dr cũng đang chuẩn bị để trả lời một số câu hỏi sau:
Trước hết đi trả lời 2 câu hỏi này, Dr sẽ nói đến 2 vấn đề sau:4. Sự khác nhau giữa return 0 và exit(0) ở cuối hàm main()
5. Sự khác nhau giữa exit(0) và exit(1), exit(2), ...
6. Các giá trị trạng thái của hàmm, hay chương trình có ý nghĩa gì?
1. Khi chấm dứt một hàm, hay một chương trình, luôn có một giá trị trạng thái(status) trả về cho hàm hay chương trình đó mặc dù bạn không có để return. Giá trị này báo cho hệ điều hành biết tình trạng chấm dứt của chương trình. Thông thường sẽ là: Trả về 0, nếu chương trình hay hàm chấm dứt ở tình trạng bình thường, tức là không lỗi. Trả về một giá trị khác 0, chương trình đã chấm dứt với tình trạng có lỗi xảy ra.
2. Hàm exit(status); Hàm này được định nghĩa trong thư viện stdlib.
Hàm exit(status); có tác dụng chấm dứt chương trình.
Trong Borland C hàm exit trước khi chấm dứt chương trình sẽ thực hiện những điều sau:
- Đóng toàn bộ các file.
- Viết các vùng đệm để đợi cho việc xuất.
- Gọi bất cứ hàm exit() nào đã được đăng ký. Ví dụ atexit
Hàm exit cũng báo cho hệ điều hành biết được trạng thái chấm dứt chương trình. Nếu status là 0 thì chương trình chấm dứt ở trạng thái bình thường (Không lỗi), còn khác không tức là chương trình chấm dứt ở trạng thái có lỗi xảy ra.
Trong thực tế sự khác nhau giữa sử dụng return và exit ở cuối các hàm là hầu như không có. Nhưng trong một số compiler thì hàm exit có thể định nghĩa có thêm các tính năng, do đó để biết được sự khác nhau còn phụ thuộc vào việc bạn sử dụng nó, nhất là khi có sự cố xảy ra.
Lưu ý: Các giá trị status nêu trên là do người viết code định nghĩa để thông báo cho hệ điều hành về trạng thái chấm dứt chương trình. Lỗi ở đây cũng là lỗi có kiểm soát.
Giá trị status này thường có ý nghĩa trong việc tương tác giữa các chương trình với nhau ở một điều kiện nào đó.
Nếu có gì còn sai sót mong các bạn bổ sung thêm cho!
Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó.Email: kevin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
Phone: 0972 89 7667
Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp hoặc bị sự thiếu kỷ luật làm tiêu tan sự nghiệp.
Ghi chú thêm:
+ Cái return được thiết kế thế nào còn phụ thuộc vào cái compiler do người viết thêm bớt.
+ Phụ thuộc vào Hệ Điều Hành (Gcc trên Win khác với Gcc trên *nix)
None!
Cho em hỏi anh Dream , mấy cái này anh học được ở cuốn sách nào vậy ? Những cuốn sách C thông thường không có nói rõ và kỹ như vậy đâu . Cho em biết tựa đề để em mua và nghiên cứu với . Em đọc qua những cái anh nói và thấy rất hay , muốn tìm hiểu sâu hơn ^_^
theo mình biết thì chuẩn cũ của C là luôn phải khai báo hàm main theo kiểu int main(). Còn cách viết void main() chỉ xuất hiện trong C++ và chỉ được 1 số compiler chấp nhận thôi.
nothing is impossible
các cậu thân mến
nếu ta không return 0 cuối hàm main
nếu compile không lỗi thì ct của ta mặc nhiên vẫn return 0 trước khi kết thúc process
Sai, main() hay void main() là cách viết kiểu C và ko cần giá trị trả về, int main() là cách viết kiểu C++ và thông thường là return 0.theo mình biết thì chuẩn cũ của C là luôn phải khai báo hàm main theo kiểu int main(). Còn cách viết void main() chỉ xuất hiện trong C++ và chỉ được 1 số compiler chấp nhận thôi.
ở trường mình học thầy vẫn xài return 1 hay return 4 là sao vậy mọi người ai có thể giải thích dùm mình với???
Tôi cũng đang học món này. Các bạn xem cách hiểu của Tôi có chấp nhận được không nhé !
Khi bạn viết một chương trình cần giá trị trả về cho hàm đó.
EX : Chẳng hạn Bố bạn đưa cho bạn 10.000 đ bảo Bạn đi mua 1 bao thuốc (1 bao thuốc Vinataba với giá 9.000 đ) Nếu Bố bạn không hỏi tiền thừa. Vậy bạn có thể được sài nó và dùng return cũng như vậy. Còn bạn trả về 1 hay 4 đó là kiểu viết theo chương trình của bạn mà hàm đó mang giá trị là 1 hay 4 .
Thông cảm nhé ! chỉ trả lời đc thế thôi. Tôi đang nghiên cứu, nếu có thời gian tôi sẽ Post nên mỗi trường hợp 1 kiểu để cho dễ hiểu nhé !
Đã được chỉnh sửa lần cuối bởi kscntt_46 : 18-01-2008 lúc 07:00 PM. Lý do: Đang nghiên cứu thêm
>"<