Trang 1 trên tổng số 3 123 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 29 kết quả

Đề tài: Sử dụng return 0 ở cuối hàm main() có ý nghĩa gì?

  1. #1
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,760

    Mặc định Sử dụng return 0 ở cuối hàm main() có ý nghĩa gì?

    Gần đây có một vài bạn hỏi có hỏi Dr là:
    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?
    Hôm nay Dr tổng hợp tại đây trả lời các bạn luôn một thể:

    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à:

    C Code:
    1. int main()
    2. {
    3.     // ...
    4. }
    hoặc là:
    C Code:
    1. int main(int argc, char* argv[])
    2. {
    3.     // ...
    4. }
    Đ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à:

    1.  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à:
    1. func();
    1. int 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().
    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();
    1. void 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 đó.

    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:

    C Code:
    1. int main() {
    2.     FILE* hinfile;
    3.     FILE* houtfile;
    4.     if (!(hinfile = fopen("infile.txt", "r"))) {
    5.         fprintf(stderr, "Error opening infile.txt for reading!\n");
    6.         return 1;
    7.     }
    8.     if (!(houtfile = fopen("outfile.txt", "w"))) {
    9.         fprintf(stderr, "Error opening outfile.txt for writing!\n");
    10.         return 2;
    11.     }
    12.     // ...
    13.     fclose(hinfile);
    14.     fclose(houtfile);
    15.     return 0;
    16. }
    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:
    1. int ret;
    2. ret = WEXITSTATUS(system("prog"));  // ret will contain the return value
    Đố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ụ:

    Bash Code:
    1. #! /bin/bash
    2. prog  # call your program
    3. if (($? != 0)); then
    4.     echo The program ran into an error.
    5. fi
    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):

    Code:
    @echo off
    prog
    if errorlevel 1 echo The program ran into an error.
    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.

    Nếu có gì còn thiếu xót mong các bạn bổ sung thêm nhé!
    Email: kevin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667

    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 đó.
    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.

  2. #2
    Ngày gia nhập
    10 2006
    Bài viết
    2

    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!!!

  3. #3
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,760

    OK! Dr cũng đang chuẩn bị để trả lời một số câu hỏi 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ì?
    Trước hết đi trả lời 2 câu hỏi này, Dr sẽ nói đến 2 vấn đề sau:

    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!
    Email: kevin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667

    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 đó.
    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.

  4. #4
    Ngày gia nhập
    09 2006
    Nơi ở
    /usr/share/.hack@
    Bài viết
    1,433

    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!

  5. #5
    Ngày gia nhập
    12 2007
    Bài viết
    224

    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 ^_^

  6. #6
    Ngày gia nhập
    09 2006
    Bài viết
    16

    Mặc định Sử dụng return 0 ở cuối hàm main() có ý nghĩa gì?

    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

  7. #7
    Ngày gia nhập
    08 2006
    Nơi ở
    TpHCM
    Bài viết
    202

    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

  8. #8
    Ngày gia nhập
    11 2006
    Bài viết
    633

    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.
    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.

  9. #9
    Ngày gia nhập
    01 2008
    Bài viết
    2

    ở 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???

  10. #10
    Ngày gia nhập
    04 2007
    Nơi ở
    Bà Trưng quê ở Mê Linh
    Bài viết
    29

    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
    >"<

Các đề tài tương tự

  1. Lập trình C Hàm getch + int main + return
    Gửi bởi vietquangkid trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 4
    Bài viết cuối: 25-01-2013, 10:20 PM
  2. hàm main() báo lỗi không trả về giá trị return là do đâu?
    Gửi bởi ManOnStreet trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 5
    Bài viết cuối: 01-11-2012, 10:05 PM
  3. Khi nào cần return 0, return 1 trong int main()
    Gửi bởi jojocolumbus trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 4
    Bài viết cuối: 22-06-2010, 10:23 AM
  4. [Error: 'main' must return 'int']
    Gửi bởi mythoa trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 7
    Bài viết cuối: 28-05-2010, 10:26 PM
  5. Cách sử dụng hàm return() trong main()
    Gửi bởi vuduykhanh trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 12
    Bài viết cuối: 02-03-2009, 01:10 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn