Trang chủ
Bài viết mới
Diễn đàn
Bài mới trên hồ sơ
Hoạt động mới nhất
VIDEO
Mùa Tết
Văn Học Trẻ
Văn Học News
Media
New media
New comments
Search media
Đại Học
Đại cương
Chuyên ngành
Triết học
Kinh tế
KHXH & NV
Công nghệ thông tin
Khoa học kĩ thuật
Luận văn, tiểu luận
Phổ Thông
Lớp 12
Ngữ văn 12
Lớp 11
Ngữ văn 11
Lớp 10
Ngữ văn 10
LỚP 9
Ngữ văn 9
Lớp 8
Ngữ văn 8
Lớp 7
Ngữ văn 7
Lớp 6
Ngữ văn 6
Tiểu học
Thành viên
Thành viên trực tuyến
Bài mới trên hồ sơ
Tìm trong hồ sơ cá nhân
Credits
Transactions
Xu: 0
Đăng nhập
Đăng ký
Có gì mới?
Tìm kiếm
Tìm kiếm
Chỉ tìm trong tiêu đề
Bởi:
Hoạt động mới nhất
Đăng ký
Menu
Đăng nhập
Đăng ký
Install the app
Cài đặt
Chào mừng Bạn tham gia Diễn Đàn VNKienThuc.com -
Định hướng Forum
Kiến Thức
- HÃY TẠO CHỦ ĐỀ KIẾN THỨC HỮU ÍCH VÀ CÙNG NHAU THẢO LUẬN Kết nối:
VNK X
-
VNK groups
| Nhà Tài Trợ:
BhnongFood X
-
Bhnong groups
-
Đặt mua Bánh Bhnong
CÔNG NGHỆ
Công Nghệ Thông Tin
Code
[Q/A] Sự khác biệt giữa main(), void main(), int main(), int main(void), int main(int argc, char *ar
JavaScript is disabled. For a better experience, please enable JavaScript in your browser before proceeding.
You are using an out of date browser. It may not display this or other websites correctly.
You should upgrade or use an
alternative browser
.
Trả lời chủ đề
Nội dung
<blockquote data-quote="Trung Kiên" data-source="post: 161174" data-attributes="member: 3"><p><span style="font-family: 'arial'"> <span style="font-size: 15px"><span style="color: #1D1D1D"><span style="color: #333333">Khi học lập trình C, C++ bạn thường thắc mắc hàm chính của chương trình là </span><strong><em>void main(),</em></strong><em> <strong>main(</strong>),</em><em><strong> int main()</strong></em><span style="color: #333333">hay </span><strong><em>int main(int argc, char * argv[]). </em></strong><span style="color: #333333">Vậy điểm khác nhau ở mỗi cách viết đó là gì? Bài viết này sẽ cố gắng giải thích rõ sự khác biệt nói trên.</span></span></span></span></p><p><span style="font-family: 'arial'"><span style="font-size: 15px"><span style="color: #1D1D1D"><span style="color: #333333"></span></span><span style="color: #1D1D1D">C và C++ có những tiêu chuẩn khác nhau khi sử dụng hàm main(). Do đó chúng ta sẽ tìm hiểu chi tiết một cách riêng biệt.</span></span></span></p><p><span style="font-family: 'arial'"><span style="font-size: 15px"><span style="color: #1D1D1D"></span></span></span></p><p><span style="font-family: 'arial'"><span style="font-size: 15px"><span style="color: #1D1D1D"><span style="color: #333333"><strong><u>1. Đối với ngôn ngữ C (For C)</u></strong></span></span></span></span></p><p><span style="font-family: 'arial'"><span style="font-size: 15px"><span style="color: #1D1D1D"><span style="color: #333333">- Theo như tiêu chuẩn C89 thì hàm chính của chương trình được viết là <em>main().</em></span></span></span></span></p><p><span style="font-family: 'arial'"><span style="font-size: 15px"><span style="color: #1D1D1D"><span style="color: #333333"><em>Với cách viết này bạn không có yêu cầu truy cập các đối số của dòng lệnh (command line arguments).</em></span></span></span></span></p><p><span style="font-family: 'arial'"><span style="font-size: 15px"><span style="color: #1D1D1D"><span style="color: #333333"><em></em></span></span></span></span></p><p><span style="font-family: 'arial'"><span style="font-size: 15px"><span style="color: #1D1D1D"><span style="color: #333333">- Nhưng các tiêu chuẩn C99 lại khuyến khích dùng 2 cách viết sau:<span style="color: #1c37a3"><img src="https://thanhcuong.files.wordpress.com/2011/01/c-language-2_thumb.jpg?w=208&h=174" alt="" class="fr-fic fr-dii fr-draggable " data-size="" style="" /></span></span></span></span></span></p><p><span style="font-family: 'arial'"><span style="font-size: 15px"><span style="color: #1D1D1D"><span style="color: #333333"><span style="color: #1c37a3"></span></span></span>[CODE][COLOR=#1D1D1D]int main ( void )</span></span></p><p><span style="font-family: 'arial'"><span style="font-size: 15px">int main ( int argc, char *argv[] )</span></span></p><p><span style="font-family: 'arial'"><span style="font-size: 15px">[/COLOR][/CODE]</span></span></p><p><span style="font-family: 'arial'"><span style="font-size: 15px"></span></span><span style="color: #1D1D1D"><span style="color: #333333"><p style="text-align: right"><span style="font-family: 'arial'"> <span style="font-size: 15px">Hoặc cũng có một số cách viết khác, như thay thế <em>int </em>bằng một kiểu <em>typedef</em> được định nghĩa như int, hoặc<em> argv </em>có thể được viết là <em>char **argv</em> …</span></span></p><p></span></span><span style="font-family: 'arial'"> <span style="font-size: 15px"><span style="color: #333333"><p style="text-align: right"></p></span></span></span></p><p style="text-align: right"><span style="font-family: 'arial'"><span style="font-size: 15px"><span style="color: #333333"></p><p></span></span></span> <span style="font-size: 15px"><span style="color: #333333"><span style="font-family: 'Georgia'"><span style="font-family: 'Georgia'"><p style="text-align: right"></p><p></span></span></span></span><span style="font-family: 'arial'"><span style="color: #333333"><p style="text-align: right"></p><p></span> <span style="font-size: 15px"><span style="color: #1D1D1D">argc và argv là những định danh có thể thay đổi nếu bạn muốn, nhưng cách viết argc/argv là một quy ước chung mà một số trình biên dịch cung cấp sẵn cho bạn.</span></span></span></p><p><span style="font-family: 'arial'"><span style="font-size: 15px"><span style="color: #1D1D1D"></span></span></span></p><p><span style="font-family: 'arial'"><span style="font-size: 15px"><span style="color: #1D1D1D"><span style="color: #333333">- Kiểu trả về của hàm main() phải luôn là một kiểu int, điều này cho phép một mã lệnh trả về được chuyển đến Invoker.</span></span></span></span></p><p><span style="font-family: 'arial'"><span style="font-size: 15px"><span style="color: #1D1D1D"><span style="color: #333333">- Theo tiêu chuẩn C89 thì khai báo return ở cuối hàm main() là cần thiết. Trong khi đó theo tiêu chuẩn C99, nếu không có khai báo return, thì return 0 sẽ được thực hiện ngầm định. Tuy nhiên theo tôi thì khai báo return ở cuối chương trình là một thoái quen tốt khi lập trình, ngay cả khi bạn không khai báo nó vẫn có thể được thực hiện một cách ngầm định (implied).</span></span></span></span></p><p><span style="font-family: 'arial'"><span style="font-size: 15px"><span style="color: #1D1D1D"></span></span></span></p><p><span style="font-family: 'arial'"><span style="font-size: 15px"><span style="color: #1D1D1D"><span style="color: #333333"><strong><u>2. Đối với C++ (For C++)</u></strong></span></span></span></span></p><p><span style="font-family: 'arial'"><span style="font-size: 15px"><span style="color: #1D1D1D"><span style="color: #333333">Dưới đây là những cách sử dụng được chấp nhận:<span style="color: #1c37a3"><img src="https://thanhcuong.files.wordpress.com/2011/01/c-language_thumb.jpg?w=192&h=153" alt="" class="fr-fic fr-dii fr-draggable " data-size="" style="" /></span></span></span></span></span></p><p><span style="font-family: 'arial'"><span style="font-size: 15px"><span style="color: #1D1D1D"><span style="color: #333333"><span style="color: #1c37a3"></span></span></span>[CODE][COLOR=#1D1D1D]int main ( int argc, char *argv[] )</span></span></p><p><span style="font-family: 'arial'"><span style="font-size: 15px">int main ()</span></span></p><p><span style="font-family: 'arial'"><span style="font-size: 15px">[/COLOR][/CODE]</span></span></p><p><span style="font-family: 'arial'"><span style="font-size: 15px"><span style="color: #1D1D1D"><span style="color: #333333">- Cách viết đầu tiên cũng giống như các quy ước trong C99.</span></span></span></span></p><p><span style="font-family: 'arial'"><span style="font-size: 15px"><span style="color: #1D1D1D"><span style="color: #333333">- Cách viết thứ 2 được sử dụng khi bạn không yêu cầu truy cập tới các đối số dòng lệnh (command line arguments), và tương đương với <em>main(void)</em> trong tiêu chuẩn C99.</span></span></span></span></p><p><span style="font-family: 'arial'"><span style="font-size: 15px"><span style="color: #1D1D1D"><span style="color: #333333">- Xin nhắc lại, kiểu trả về phải luôn luôn là một kiểu int, và hàm sẽ trả về giá trị không ở cuối. Mặc dù đây không phải là một yêu cầu của tiêu chuẩn.</span></span></span></span></p><p><span style="font-family: 'arial'"><span style="font-size: 15px"><span style="color: #1D1D1D"><span style="color: #333333"><strong><u>3. (C) Sự khác nhau giữa <em>int main()</em> và int <em>main(void)</em></u></strong></span></span></span></span></p><p><span style="font-family: 'arial'"><span style="font-size: 15px"><span style="color: #1D1D1D"><span style="color: #333333">Một quan điểm sai lầm phổ biến của các lập trình viên ngôn ngữ C là các khai báo nguyên mẫu hàm (function prototyped) như sau không có đối số.</span></span><span style="color: #1D1D1D">int foo();</span></span></span></p><p><span style="font-family: 'arial'"><span style="font-size: 15px"><span style="color: #1D1D1D"></span></span></span></p><p><span style="font-family: 'arial'"><span style="font-size: 15px"><span style="color: #1D1D1D"><span style="color: #333333">Trong thực tế, hàm này được xem như không biết số đối số. Sử dụng từ khóa void trong dấu ngoặc đơn (<em>int foo(void) </em>) là cách chính xác nhất để nói với trình biên dịch là hàm của bạn khai báo không có đối số.</span></span></span></span></p><p><span style="font-family: 'arial'"><span style="font-size: 15px"><span style="color: #1D1D1D"><span style="color: #333333"><strong><u>4. <em>What’s the deal with void main</em>()</u></strong></span></span></span></span></p><p><span style="font-family: 'arial'"><span style="font-size: 15px"><span style="color: #1D1D1D"><span style="color: #333333">- Theo các hàm gọi và trả về (calling / returning) trong C và C++ thì nếu bạn không bao giờ muốn trả về (return) bất cứ thứ gì từ một hàm. Bạn định nghĩa kiểu tra về của nó là void. Ví dụ hàm sau không có đối số và không có giá trị trả về:</span></span><span style="color: #1D1D1D">void foo( void)</span></span></span></p><p><span style="font-family: 'arial'"><span style="font-size: 15px"><span style="color: #1D1D1D"></span></span></span></p><p><span style="font-family: 'arial'"><span style="font-size: 15px"></span><span style="color: #1D1D1D"> <span style="font-size: 15px"><span style="color: #333333">- Một sai lầm phổ biến là các lý luận tương tự ví dụ trên bạn lại đem áp dụng cho <em>main()</em>. Đó là điều không thể vì main() là một hàm đặc biệt, và bạn phải luôn xác định kiểu trả về của nó được định nghĩa là kiểu int. Có một số ngoại lệ như void main() là được phép nhưng nó chỉ hoạt động trên những hệ thống riêng biệt. Nếu bạn không chắc chắn bạn có đang sử dụng một trong những hệ thống đặc biết đó hay không, thì câu trả lời đơn giản là bạn nên sử dụng kiểu trả về tiêu chuẩn là int. Khi bạn gặp trường hợp này bạn sẽ hiểu rõ hơn về điều tôi đang nói.</span></span></span></span></p><p><span style="font-family: 'arial'"><span style="color: #1D1D1D"><span style="font-size: 15px"><span style="color: #333333">- Bạn sẽ nhận được một cảnh báo (warning) từ trình biên dịch nếu bạn sử dụng “void main()” khi lấy code từ các diễn đàn. Do đó khi post code của mình lên các diễn đàn hay blog bạn nên sử dụng cách viết theo tiêu chuẩn để đảm bảo rằng những ai sử dụng code của bạn không phải rối trí vì những cảnh báo từ trình biên dịch của họ, mặc dù chương trình của bạn vẫn chạy tốt trên trình biên dịch của mình.</span></span></span></span></p><p><span style="font-family: 'arial'"><span style="color: #1D1D1D"><span style="font-size: 15px"></span></span></span></p><p><span style="font-family: 'arial'"><span style="color: #1D1D1D"><span style="font-size: 15px"><span style="color: #333333"><u>5. <strong><em>int main(int argc, char *argv[], char *envp[]) ?</em></strong></u></span></span></span></span></p><p><span style="font-family: 'arial'"><span style="color: #1D1D1D"><span style="font-size: 15px"></span><span style="color: #333333"><strong> <span style="font-size: 15px"><strong>int main(int argc, char *argv[], char *envp[]) </strong>là một phần mở rộng của tiêu chuẩn đảm bảo, một tham số có thể được bổ sung cho main(), trên một hệ thống, được sử để truy cập vào các biến môi trường (environment variables). Điều này sẽ không đảm bảo sẽ làm việc trên tất cả các trình biên dịch, vì vậy hãy cẩn thận khi sử dụng nó nếu bạn muốn giữ cách code của riêng mình.</span></strong></span></span></span></p><p><span style="font-family: 'arial'"><span style="color: #1D1D1D"><span style="color: #333333"><strong></strong></span></span></span></p></blockquote><p></p>
[QUOTE="Trung Kiên, post: 161174, member: 3"] [FONT=arial] [SIZE=4][COLOR=#1D1D1D][COLOR=#333333]Khi học lập trình C, C++ bạn thường thắc mắc hàm chính của chương trình là [/COLOR][B][I]void main(),[/I][/B][I] [B]main([/B]),[/I][I][B] int main()[/B][/I][COLOR=#333333]hay [/COLOR][B][I]int main(int argc, char * argv[]). [/I][/B][COLOR=#333333]Vậy điểm khác nhau ở mỗi cách viết đó là gì? Bài viết này sẽ cố gắng giải thích rõ sự khác biệt nói trên. [/COLOR][/COLOR][COLOR=#1D1D1D]C và C++ có những tiêu chuẩn khác nhau khi sử dụng hàm main(). Do đó chúng ta sẽ tìm hiểu chi tiết một cách riêng biệt. [/COLOR] [COLOR=#1D1D1D][COLOR=#333333][B][U]1. Đối với ngôn ngữ C (For C)[/U][/B][/COLOR] [COLOR=#333333]- Theo như tiêu chuẩn C89 thì hàm chính của chương trình được viết là [I]main().[/I][/COLOR] [COLOR=#333333][I]Với cách viết này bạn không có yêu cầu truy cập các đối số của dòng lệnh (command line arguments). [/I][/COLOR] [COLOR=#333333]- Nhưng các tiêu chuẩn C99 lại khuyến khích dùng 2 cách viết sau:[COLOR=#1c37a3][IMG]https://thanhcuong.files.wordpress.com/2011/01/c-language-2_thumb.jpg?w=208&h=174[/IMG] [/COLOR][/COLOR][/COLOR][CODE][COLOR=#1D1D1D]int main ( void ) int main ( int argc, char *argv[] ) [/COLOR][/CODE] [/SIZE][/FONT][COLOR=#1D1D1D][COLOR=#333333][RIGHT][FONT=arial] [SIZE=4]Hoặc cũng có một số cách viết khác, như thay thế [I]int [/I]bằng một kiểu [I]typedef[/I] được định nghĩa như int, hoặc[I] argv [/I]có thể được viết là [I]char **argv[/I] …[/SIZE][/FONT][/RIGHT] [/COLOR][/COLOR][FONT=arial] [SIZE=4][COLOR=#333333][RIGHT] [/RIGHT] [/COLOR][/SIZE][/FONT] [SIZE=4][COLOR=#333333][FONT=Georgia][FONT=Georgia][RIGHT][/RIGHT] [/FONT][/FONT][/COLOR][/SIZE][FONT=arial][COLOR=#333333][RIGHT][/RIGHT] [/COLOR] [SIZE=4][COLOR=#1D1D1D]argc và argv là những định danh có thể thay đổi nếu bạn muốn, nhưng cách viết argc/argv là một quy ước chung mà một số trình biên dịch cung cấp sẵn cho bạn. [/COLOR] [COLOR=#1D1D1D][COLOR=#333333]- Kiểu trả về của hàm main() phải luôn là một kiểu int, điều này cho phép một mã lệnh trả về được chuyển đến Invoker.[/COLOR] [COLOR=#333333]- Theo tiêu chuẩn C89 thì khai báo return ở cuối hàm main() là cần thiết. Trong khi đó theo tiêu chuẩn C99, nếu không có khai báo return, thì return 0 sẽ được thực hiện ngầm định. Tuy nhiên theo tôi thì khai báo return ở cuối chương trình là một thoái quen tốt khi lập trình, ngay cả khi bạn không khai báo nó vẫn có thể được thực hiện một cách ngầm định (implied).[/COLOR] [COLOR=#333333][B][U]2. Đối với C++ (For C++)[/U][/B][/COLOR] [COLOR=#333333]Dưới đây là những cách sử dụng được chấp nhận:[COLOR=#1c37a3][IMG]https://thanhcuong.files.wordpress.com/2011/01/c-language_thumb.jpg?w=192&h=153[/IMG] [/COLOR][/COLOR][/COLOR][CODE][COLOR=#1D1D1D]int main ( int argc, char *argv[] ) int main () [/COLOR][/CODE] [COLOR=#1D1D1D][COLOR=#333333]- Cách viết đầu tiên cũng giống như các quy ước trong C99.[/COLOR] [COLOR=#333333]- Cách viết thứ 2 được sử dụng khi bạn không yêu cầu truy cập tới các đối số dòng lệnh (command line arguments), và tương đương với [I]main(void)[/I] trong tiêu chuẩn C99.[/COLOR] [COLOR=#333333]- Xin nhắc lại, kiểu trả về phải luôn luôn là một kiểu int, và hàm sẽ trả về giá trị không ở cuối. Mặc dù đây không phải là một yêu cầu của tiêu chuẩn.[/COLOR] [COLOR=#333333][B][U]3. (C) Sự khác nhau giữa [I]int main()[/I] và int [I]main(void)[/I][/U][/B][/COLOR] [COLOR=#333333]Một quan điểm sai lầm phổ biến của các lập trình viên ngôn ngữ C là các khai báo nguyên mẫu hàm (function prototyped) như sau không có đối số.[/COLOR][/COLOR][COLOR=#1D1D1D]int foo(); [/COLOR] [COLOR=#1D1D1D][COLOR=#333333]Trong thực tế, hàm này được xem như không biết số đối số. Sử dụng từ khóa void trong dấu ngoặc đơn ([I]int foo(void) [/I]) là cách chính xác nhất để nói với trình biên dịch là hàm của bạn khai báo không có đối số.[/COLOR] [COLOR=#333333][B][U]4. [I]What’s the deal with void main[/I]()[/U][/B][/COLOR] [COLOR=#333333]- Theo các hàm gọi và trả về (calling / returning) trong C và C++ thì nếu bạn không bao giờ muốn trả về (return) bất cứ thứ gì từ một hàm. Bạn định nghĩa kiểu tra về của nó là void. Ví dụ hàm sau không có đối số và không có giá trị trả về:[/COLOR][/COLOR][COLOR=#1D1D1D]void foo( void) [/COLOR] [/SIZE][COLOR=#1D1D1D] [SIZE=4][COLOR=#333333]- Một sai lầm phổ biến là các lý luận tương tự ví dụ trên bạn lại đem áp dụng cho [I]main()[/I]. Đó là điều không thể vì main() là một hàm đặc biệt, và bạn phải luôn xác định kiểu trả về của nó được định nghĩa là kiểu int. Có một số ngoại lệ như void main() là được phép nhưng nó chỉ hoạt động trên những hệ thống riêng biệt. Nếu bạn không chắc chắn bạn có đang sử dụng một trong những hệ thống đặc biết đó hay không, thì câu trả lời đơn giản là bạn nên sử dụng kiểu trả về tiêu chuẩn là int. Khi bạn gặp trường hợp này bạn sẽ hiểu rõ hơn về điều tôi đang nói.[/COLOR] [COLOR=#333333]- Bạn sẽ nhận được một cảnh báo (warning) từ trình biên dịch nếu bạn sử dụng “void main()” khi lấy code từ các diễn đàn. Do đó khi post code của mình lên các diễn đàn hay blog bạn nên sử dụng cách viết theo tiêu chuẩn để đảm bảo rằng những ai sử dụng code của bạn không phải rối trí vì những cảnh báo từ trình biên dịch của họ, mặc dù chương trình của bạn vẫn chạy tốt trên trình biên dịch của mình.[/COLOR] [COLOR=#333333][U]5. [B][I]int main(int argc, char *argv[], char *envp[]) ?[/I][/B][/U][/COLOR] [/SIZE][COLOR=#333333][B] [SIZE=4][B]int main(int argc, char *argv[], char *envp[]) [/B]là một phần mở rộng của tiêu chuẩn đảm bảo, một tham số có thể được bổ sung cho main(), trên một hệ thống, được sử để truy cập vào các biến môi trường (environment variables). Điều này sẽ không đảm bảo sẽ làm việc trên tất cả các trình biên dịch, vì vậy hãy cẩn thận khi sử dụng nó nếu bạn muốn giữ cách code của riêng mình.[/SIZE] [/B][/COLOR][/COLOR][/FONT] [/QUOTE]
Tên
Mã xác nhận
Gửi trả lời
CÔNG NGHỆ
Công Nghệ Thông Tin
Code
[Q/A] Sự khác biệt giữa main(), void main(), int main(), int main(void), int main(int argc, char *ar
Top