ความแตกต่างระหว่าง
main()
void main()
void main(void)
main(void)
เป็นอย่างไรคับ
(คือที่ผ่านมาผมก็ใช้แต่ void main มาตลอดแต่ไม่รู้ว่ามันหมายถึงอะไร)
ความแตกต่างระหว่าง
main()
void main()
void main(void)
main(void)
เป็นอย่างไรคับ
(คือที่ผ่านมาผมก็ใช้แต่ void main มาตลอดแต่ไม่รู้ว่ามันหมายถึงอะไร)
ที่ถูกต้องตามมาตราฐานของภาษาC คือ
int main ( int argc , char *argv[])
argc จะเป็นจำนวน Argument
argv[] คือArgumentของ command line ครับ
สองตัวนี้ค่อนข้างจำเป็นนะครับ โดยปกติ โปรแกรมของเราจะต้องรันใน command line ครับ แล้วจะมีการสงArgumentบางอย่างมาเพื่อบอกให้โปรแกรมทรอบ เช่นว่า ว่าควรจะเปิดไฟล์ไหน มี config อย่างไร
เช่น
C:\Program Files\Internet Explorer\iexplore www.google.com
ในกรณีนี้ argc จะเท่ากับ 2 ครับ
argv[0] = C:\Program Files\Internet Explorer\iexplore
argv[1] = www.google.com
ก็คือเป็นการบอกให้ Internet Explorer ที่เรากำลังจะเปิดให้ทราบว่า เปิดไปที่ google เลยนะ
แต่.........ในกรณีมือใหม่เนี่ย เราคงไม่เขียนโปรแกรมละเอียดอะไรขนาดนั้นใช่ไหมครับ เราก็สามารถเขียนเป็น int main() หรือ int main(void) ไปก็ได้ครับ ก็จะไม่ได้2ตัวนั้นไปใช้เฉยๆ ไม่มีปัญหา
ทีนี้ที่ต้อง type return เป็น int (int main() ) ก็เพราะว่าโปรแกรมของเราอาจจะไม่ได้ถูกเรียกตรงๆ แต่อาจจะถูกเรียกจากโปรแกรมอื่นได้
การที่ main() ของเรามี return int เนี่ย มักจะให้ return 0; เพิ่มบอกว่า>>โปรแกรมเราจบการทำงานอย่างสมบูรณ์นะ
ถ้าเกิด error ขึ้นเราอาจจะ returnค่าอื่นที่ไม่ใช้ 0 ก็แล้วแต่
(พวกที่เขียน file batch จะรู้ดีครับ)
แต่..........ก็อีกนั้นแหละ มือใหม่จะใช้ void ก็ไม่มีใครว่า มันก็จะถูกปล่อยค่าreturn มันก็จะถูกปล่อยตามมีตามเกิดแหละครับ (หรือสำหรับcompilerบางตัวอาจจะบังคับเป็น 0 ให้)
แต่เป็นสักหน่อยแล้ว อยากจะขอนะครับว่า int main() นะครับ บางบอร์ดสอบC/C++ตามเมืองนอกเขาถือกันนะครับ
ถ้าใช้ void main() อาจจะโดนหาว่า noob
{
ขอร่วมแสดงความคิดเห็นแบบไม่ซีเรียสด้วยคนครับ
เอาเป็นว่า ถ้าพูดกันตาม Standard ที่เขาว่า ก็ควรจะใช้
int main()
หรือ
int main( int argc , char *argv[])
แต่ทั้งนี้การจะใช้การประกาศในรูปแบบอื่นเช่น
void main() หรือ main() หรือ void main()
หรือ void main(void) หรือ int main(void) หรือ อื่นๆ
ก็ไม่ใช่ว่าคอมไพล์เลอร์จะไม่ยอม แต่โดยพื้นฐานของ คอมไพล์เลอร์ทุกตัว ถ้าบางส่วนของ
CODE ไม่เหมาะสม (แต่ก็ไม่ใช่ข้อผิดพลาด - error) จะมีข้อความเตือน (warning message)
ขึ้นในขณะที่ทำการคอมไพล์ (หรือ BUILT)
ทั้งนี้ขึ้นอยู่กับ Option ในการคอมไพล์ด้วย ซึ่ง Option นี้สามารถกำหนดให้เข้มงวดถึงขนาดถ้ามีความ
ไม่ถูกต้องแม้เพียงเล็กน้อย ก็ให้เปรียบเสมือนมีข้อผิดพลาด (error) ซึ่งมีผลทำให้คอมไพล์ไม่ผ่านก็ได้
หรือกำหนดให้ไม่สนใจข้อความเตือนเลย ก้มหน้าก้มตาคอมไพล์มันลูกเดียว
ขอเพียงไม่มี ข้อผิดพลาดที่ร้ายแรง ก็ให้ผ่านหมดก็ยังได้
ผมขอเสริมข้อความที่ คุณ ฺBerryBoy
โพสท์ไว้ว่า การที่โปรแกรมใดๆ เมื่อทำงานเสร็จแล้วก็ควรส่งค่า Return เป็น 0 เพื่อบอกว่าโปรแกรม
จบการทำงานอย่างสมบูรณ์ เป็นหลักการที่ยอมรับกันทั่วไป ผมก็เห็นด้วยว่าเป็นเรื่องที่ดี
แต่ก็มีบางคนแย้งว่า แล้วเจ้า OS มันทำอะไรบ้างกับ รีเทิร์นศูนย์ หรือไม่ศูนย์ (ซึ่งผมเองก็ไม่ค่อยเห็น
มีการทำอะไร นอกจากจะมีไดอะล็อกถามว่าจะให้ส่ง Report ไปให้ไมโครซอฟท์ช่วยตรวจสอบให้หรือปล่าว?
ในบางครั้งเท่านั้น)
แต่ในเมื่อเป็นมาตราฐาน เราควรยึดถือและปฏิบัติ การที่เราจะเป็นโปรแกรมเมอร์มืออาชีพก็เปรียบเสมือนกับ
ขับรถบนถนนสาธารณะ ถ้าจะเปลี่ยนเลนก็ต้องเปิดไฟเลี้ยวมิใช่หรือ ต่างจากเวลาที่เราขับรถบนถนนในหมู่บ้าน
ที่แทบไม่ต้องห่วงว่าจะมีรถที่วิ่งตามหลังมาจะชนท้ายรถเราเพราะ ซัก 10 นาทีจะมีมาซักคัน
(แต่ผมแนะนำว่าทำให้เป็นนิสัยไว้ดีกว่านะ)
ทีนี้ก็อยู่กับคุณแล้วละครับว่าจะเลือกแบบไหน
แต่อยากจะให้เกร็ดไว้เล็กๆ ว่า
“main() เป็นฟังก์ชันพิเศษ ที่ไม่ว่าจะใช้ void main() หรือ int main() หรือ main()
เมื่อทำการคอมไพล์ (ด้วย gcc, g++, Borland C++ 5.5 ,VC++ .NET 2008)
แล้วจะให้ผลเหมือนกัน >> คือ ถ้าโปรแกรมสามารถทำงานได้จนจบโดยไม่ถูก
Terminate ทุกโปรแกรมจะส่งค่าเป็น 0 กลับมา จะยกเว้นก็แต่โปรแกรมที่คอมไพล์ด้วย VC++ 6.0 เท่านั้น”
ผมว่ามันน่าแปลกนะครับ
หมายเหตุ กรณีของ VC++ .NET และ VC++ 6.0 ถ้าเราประกาศเป็น void main() จะไม่สามารถวาง return 0;
ไว้ที่ตอนท้ายของฟังก์ชัน main() ได้
ถ้าใครลองแล้วได้ผลเป็นแบบอื่นหรือชอบแบบไหน ก็ลองมาแชร์ข้อมูลกันดูนะครับ
return 0;
}
ที่ผมเรียนมาถ้าจำไม่ผิดมันเกี่ยวกับการ return ค่า ยังไงสักอย่างนี่หละครับ จำม้ายค่อยได้แล้วเหมือนกัน
![]()
ถ้าเอาเท่าที่ ผมเรียนมานะ ครับ มันเป็นเรื่องของการ รับค่า ส่งค่าของฟังก์ชั่นอ่ะ ครับ
โดยมีหลักการว่า type Func (type variable)
จะเห็นว่ามีส่วนที่เป็น type อยู่ 2 ต่ำแหน่ง คือ ตำแหน่ง ด้านหน้า จะเป็นการส่งค่าของฟังก์ชั่น โดยฟังก์ชั่น นั้น จะสามารถส่งค่าได้ค่าเดียวเท่านั้น
ส่วนตัวด้านในวงเล็บนั้นหมายถึงการรับค่าของฟังก์ชั่นอ่ะครับ
main ก็เป็นฟังก์ชั่น ฟังก์ชั่นหนึ่งนะครับ มันเป็นฟังก์ชั่นหลัก ที่จำเป็นต้องมีอ่ะครับ
ยังไงก็ลองศึกษาเพิ่มเติม ตามหนังสือเอานะครับ
ผมก็กำลังศึกษาอยู่เช่นกัน ครับ มีอะไร ก็แชร์ ความรู้กัน แล้วกันครับ
**Hidden Content: To see this hidden content your post count must be 2 or greater.**
เรียนมาตั้งนานพึงจะเข้าใจมากกว่าเดิม ก็วันนี้
ขอบคุณมากครับ
อ่านๆแล้ว ท่าทางน่าสนุก มาคุยกันมั่งดีกว่า
อย่าทำ เพราะกลัวคนอื่นหาว่า noob ครับ แต่จงหาเหตุผลประกอบการทำแต่..........ก็อีกนั้นแหละ มือใหม่จะใช้ void ก็ไม่มีใครว่า มันก็จะถูกปล่อยค่าreturn มันก็จะถูกปล่อยตามมีตามเกิดแหละครับ (หรือสำหรับcompilerบางตัวอาจจะบังคับเป็น 0 ให้)
แต่เป็นสักหน่อยแล้ว อยากจะขอนะครับว่า int main() นะครับ บางบอร์ดสอบC/C++ตามเมืองนอกเขาถือกันนะครับ
ถ้าใช้ void main() อาจจะโดนหาว่า noob
[/b]
มันไม่ส่ง report ไปให้ microsoft หรอกครับโพสท์ไว้ว่า การที่โปรแกรมใดๆ เมื่อทำงานเสร็จแล้วก็ควรส่งค่า Return เป็น 0 เพื่อบอกว่าโปรแกรม
จบการทำงานอย่างสมบูรณ์ เป็นหลักการที่ยอมรับกันทั่วไป ผมก็เห็นด้วยว่าเป็นเรื่องที่ดี
แต่ก็มีบางคนแย้งว่า แล้วเจ้า OS มันทำอะไรบ้างกับ รีเทิร์นศูนย์ หรือไม่ศูนย์ (ซึ่งผมเองก็ไม่ค่อยเห็น
มีการทำอะไร นอกจากจะมีไดอะล็อกถามว่าจะให้ส่ง Report ไปให้ไมโครซอฟท์ช่วยตรวจสอบให้หรือปล่าว?
ในบางครั้งเท่านั้น) [/b]'' เพียงแต่มันมีวิธีเรียกเพื่อดูค่าได้ว่า โปรแกรมนั้นๆ ถูกปิดไปแบบไหนโดยการใช้ API อีกทอดนึง ยกตัวอย่างเช่น ใน Windows API จะมี API ที่่่ชื่อว่า GetExitCodeProcess เพื่อใช้ในการ Get ค่าของ ExitCode ของ Process นั้นๆ (อ่านเพิ่มเติมได้ที่ http://msdn.microsoft.com/en-us/library/ms...8VS.85%29.aspx)
ดังนั้นจึงควรมีการ Return ค่าเอาไว้ด้วย (แต่ถ้าไม่คิดอะไรมากก็ void ไปนั่นแหละ) เพื่อที่เราจะได้สามารถตรวจสอบได้ว่า Program หรือ Process ของเราทำงาน แล้วจบ ได้อย่างถูกต้องหรือไม่
Return Exit Code ครับที่ผมเรียนมาถ้าจำไม่ผิดมันเกี่ยวกับการ return ค่า ยังไงสักอย่างนี่หละครับ จำม้ายค่อยได้แล้วเหมือนกัน[/b]
โปรดระวัง บอร์ดนี้ไม่สนับสนุนการพิมพ์ขอบคุณเรียนมาตั้งนานพึงจะเข้าใจมากกว่าเดิม ก็วันนี้
ขอบคุณมากครับ[/b]
ก็พอมีความรู้บ้างเกี่ยวกับการเขียนภาษาพวกนี้นะครับ ก็อยากจะอธืบายตามความรู้ของผมว่า
int main() , void main , int main( int xx .char cc) , void(int yy,char* cc)
การประกาศเหล่านี้ เป็นการประกาศส่วนหัวของฟังก์ชัน ในโปรแกรม โดยที่ผมเข้าใจ คือ ส่วนแรกสุดนั้น เป็นการประกาศ การ return ค่าของ ฟังก์ชั่นนั้นๆ เช่น ประกาศ
void main() เป็นการประกาศฟังก์ชั่นที่ไม่มีการ return ค่านั่นเอง คือ return ค่าชนิดว่างเปล่า [void]
int main() เป็นการประกาศฟังก์ชั่นที่มีการ return ค่า โดย ให้ return ค่ากลับไปเป็น ชนิด int เช่น ส่วนใหญ่ที่เราทำก็คือ return 0;
คือจบโปรแกรมแล้ว ฟังก์ชั่นนี้ return ค่า 0
ส่วนพวกที่อยู่ใน วงเล็บนั้นเป็นค่าของ argument ที่เรา จะ pass เข้าไปในฟังก์ชั่นนั้นๆ เช่น
int main( int xx .char cc) <<< ฟังก์ชั่นนี้จะ return เป็นชนิด int และ รับค่าที่pass เข้ามาเป็นชนิด int และ char
โดยค่าที่รับเข้ามาจะถูกเก็บไว้ ตัวแปรที่ประกาศไว้คือ xx และ cc แล้วนำค่าที่รับไปใช้ในโปรแกรม ซึ่งนำไปใช้อย่างไรนั้นก็แล้วแต่เรา จะ เขียนโปรแกรมในส่วน body นั่นเองครับ
อาจจะพอช่วยได้บ้างนะ
ผิดพลาดอย่างไรก็ขออภัยด้วยครับ
ตามความคิดของผมน่ะ เนื่องจาก ภาษา ซี และ ซีบวกบวก
บังคับไว้แล้วว่าต้องมีการ รีเทินร์ค่า เพื่อตรวจสอบการทำงาน
ซึ่งปกติแล้วจะส่งคืน ค่า 0 หรือ EXIT_SUCCESS ถ้าโปรแกรม
ทำงานจบ ซึ่งก็รวมไปถึงการประกาศ void หน้า main ที่จริงๆแล้ว
ก็มีการแอบส่งค่าออกไปเหมือนกัน ซึ่งถ้าเกิด ดวงแตก สิ่งที่รีเทินร์
ออกไปทำให้ OS เข้าใจผิด ว่าโปรแกรมทำงานผิดพลาดล่ะ
คิดดูว่าจะเกิดอะไรขึ้น ดีบักตาเหลือก เลย![]()
ผมมี ลิงค์ดีๆ เกี่ยวกับเรื่องนี้ รออ่านดูน่ะครับ
แปลให้ไม่ไหว เพราะ ภาษา ตังเองก็ไม่เก่งมาก อ่านเข้าใจ เพราะดูโค๊ด
http://users.aber.ac.uk/auj/voidmain.shtml
Actions : (View-Readers)
There are no names to display.