Int main void là gì

Cho hỏi vấn đề này cái :
void main() và int main() khi nào mình dùng void và khi nào mình dùng int ???? và còn loại nào khác để xài chung với hàm main nữa ko ??? bối rối khúc này quá

1

Bạn đang thắc mắc? Ghi câu hỏi của bạn và đăng ở chế độ cộng đồng (?)

int main() - Ở đây, hàm main() trả về một biến kiểu int. Nó được đề nghị để sử dụng chính cùng với đối số argc và argv. Đây là cách khuyến khích, và đây là cách bạn viết chức năng chính của bạn.

void main() - Ở đây, hàm main () không trả lại bất cứ điều gì. Điều này không bao giờ là một cách tiếp cận tốt, như trong trường hợp nhất định, bạn có thể sử dụng mã trở lại của các chương trình để gọi các chương trình khác, và do đó không bao giờ sử dụng phương pháp này.

main() - Nếu bạn đang sử dụng một trình biên dịch C cũ, thì có lẽ nó sẽ làm việc, cũng như trong các trình biên dịch như vậy, hàm này theo mặc định trả lại một giá trị int của 0, trừ khi được chỉ định. Tuy nhiên, nó có thể phá vỡ với trình biên dịch C mới hơn.

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à void main(), main(), int main() hay int main(int argc, char * argv[]).  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.

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.

1. Đối với ngôn ngữ C (For C)

– Theo như tiêu chuẩn C89 thì hàm chính của chương trình được viết là main().

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

– Nhưng các tiêu chuẩn C99 lại khuyến khích dùng 2 cách viết sau:

       int main ( void )
       int main ( int argc, char *argv[] )

Hoặc cũng có một số cách viết khác, như thay thế int bằng một kiểu typedef được định nghĩa như int, hoặc argv có thể được viết là  char **argv …

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.

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

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

2. Đối với C++ (For C++)

Dưới đây là những cách sử dụng được chấp nhận:

int main ( int argc, char *argv[] )
int main ()

– Cách viết đầu tiên cũng giống như các quy ước trong C99.

– 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  main(void) trong tiêu chuẩn C99.

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

3. (C) Sự khác nhau giữa int main() và int main(void)

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

int  foo();

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  (int foo(void) ) 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ố.

4. What’s the deal with void main()

– 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ề:

void  foo( void)

– 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 main(). Đó 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.

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

5. int main(int argc, char *argv[], char *envp[]) ?

int main(int argc, char *argv[], char *envp[]) 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.

Click vào đầy để xem thêm một số thông tin nền tảng  để bạn hiểu thêm tại sao sử dụng void main()  là không tốt (is bad).

(Theo cprogramming.com)

This entry was posted in C++. Bookmark the permalink.

Chào mọi người,

Trong khi học về lập trình C thì em thấy một số tài liệu sử dụng cách viết void main() một số khác sử dụng int main(). Theo ý kiến cá nhân của mọi người thì nên sử dụng cách nào và vì sao?

Mình mới học C, coi clip của a Đạt, có nghe a giải thích nhưng chưa hiểu lắm, bạn nào giỏi có thể giải thích dùm mình sự khác biệt của void main và int main, công dụng của 2 hàm này là gì

5 Likes

Void main là ngày xưa. Bây giờ phải viết là int main.
Đó là quy chuẩn.

4 Likes

Hàm có kiểu void là hàm không trả về giá trị.
Hàm có kiểu int sẽ trả về giá trị trong phạm vi biến int.

Bạn cứ học tiếp, sau này đến bài về Hàm (function) sẽ hiểu rõ hơn.

4 Likes

sau khi thực hiện 1 hàm thì chúng ta cần trả về cho máy để báo hiệu sự hoàn thành của hàm tuy nhiên hàm void main thì lại ko yêu cầu trả về dữ liệu gì cả bạn hiểu như khi gọi hàm void thì nó trực tiếp thực hiện hàm đó xong thôi ko cần phải trả về cái gì để báo cho chương trình cả

4 Likes

Theo mình thì bạn nên viết Void main (void)<Không trả về giá trị,không đối > là rõ rành,cụ thể nhất

1 Like

Viết void main hay int main mình nghĩ là phụ thuộc vào compiler thôi. Nếu compiler yêu cầu phải trả về giá trị thì phải viết int main, không thì cứ viết void main (cứ thử nếu void main chạy báo lỗi thì chuyển thành int, báo nỗi nữa thì để main không thôi).
Cái này không quá quan trọng vì các ngôn ngữ C# hay Java thì đều viết là void main cả.

2 Likes

Cái quy chuẩn đó là gì bạn? Cho mình tên quy chuẩn đc không? Tại mình thấy nhiều các ngôn ngữ khác toàn viết là void main cả.

1 Like

Standard C — Hosted Environment

For a hosted environment (that’s the normal one), the C11 standard (ISO/IEC 9899:2011) says:

5.1.2.2.1 Program startup

The function called at program startup is named main. The implementation declares no prototype for this function. It shall be defined with a return type of int and with no parameters:

int main(void) { /* ... */ }

or with two parameters (referred to here as argc and argv, though any names may be used, as they are local to the function in which they are declared):

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

Bạn tham khảo thêm ở đây

stackoverflow.com

c++, c, return-value, main

4 Likes

Void main là kiểu vô định,ko có giá trị trả về của hàm main, int main là hàm main trả về giá trị int,tuy nhiên bạn không trả về cũng được.Điều này chỉ áp dụng cho hàm main thôi.Hàm main thực chất là 1 procedure,giá trị trả về của main k quan trọng mà chỉ có giá trị trả về của hàm con khác ms quan trọng.Tất cả các hàm khác đều tuân theo đúng quy luật là : Void thì không có giá trị trả về , int (hay kiểu gì khác) + tên hàm thì phải có giá trị trả về .

Bạn có vẻ chưa học Pascal giống mình.Ban đầu sẽ hơi ngợp khi học C vs C++. Bạn nên học từ từ, ko được copy code hoặc chưa hiểu mà đã code,sẽ gây lười suy nghĩ. Ban đầu cứ code,sai tìm lỗi,ko tìm được nhờ người khác sửa và giải thích giùm.

Thân

7 Likes

Chào bạn, Mình giải thích như thế này cho bạn hiểu nhé. Trong hệ điều hành UNIX nói chung và Linux nói riêng, khi bạn run 1 chương trình gì đó ‘./’ tức là bạn đang gọi vào hàm main của chương trình (system call). Chương trình đó sẽ tự động trả về 1 biến tên là errno, biến này được quy định: ‘= 0’ là success ‘> 0’ là có lỗi. Số 1 sẽ là 1 lỗi khác, số 2 sẽ là 1 lỗi khác. Bạn tìm vào thư mục /usr/include/asm-genertic/ có 2 file errno.h & errno-bash.h sẽ có định nghĩa về các lỗi này.

Để thấy đươc biến này khi chạy chương trình bạn dùng lệnh này ngay sau khi chạy chương trình đó

$ echo $?

Nếu xuất ra số 0 thì chương trình bạn chạy đúng. Còn ‘>0’ thì chạy sai Do đó việc đề int main() thay vì void main() là để cho chương trình trả về 1 giá trị báo cho user biết là chương trình có chạy đúng không. Như bạn thấy, return 0; hay exit(0); đây là trả về biến errno cho chương trình. Đó là lý do chính dẫn đến việc không ai dùng hàm void main() nữa. Một lý do nữa là do một số compiler không chấp nhận void main() lý do này chỉ là chữa cháy thôi. Cái chính vẫn là như mình vừa đề cập.

Thân!

14 Likes

Cam On An . Giai Thich rat hay va de hieu .

1 Like

Chỉ đúng nếu bạn viết kiểu tương tác trực tiếp, còn viết để chạy trong script thì phải dùng int.

1 Like

Bác giải thích khá chi tiết, cảm ơn bác nhé!

Home Categories FAQ/Guidelines Terms of Service Privacy Policy

Video liên quan

Chủ đề