View Full Version : ช่วยตอบคำถามภาษา c ทีคับ(ฟังก์ชันmain)
talerngpong
02-08-2009, 12:52 PM
ความแตกต่างระหว่าง
main()
void main()
void main(void)
main(void)
เป็นอย่างไรคับ
(คือที่ผ่านมาผมก็ใช้แต่ void main มาตลอดแต่ไม่รู้ว่ามันหมายถึงอะไร)
BerryBoy
07-08-2009, 08:36 PM
ที่ถูกต้องตามมาตราฐานของภาษา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
sritrang
09-08-2009, 05:24 AM
{
ขอร่วมแสดงความคิดเห็นแบบไม่ซีเรียสด้วยคนครับ
เอาเป็นว่า ถ้าพูดกันตาม 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;
}
ABiTz666
16-08-2009, 01:34 AM
ที่ผมเรียนมาถ้าจำไม่ผิดมันเกี่ยวกับการ return ค่า ยังไงสักอย่างนี่หละครับ จำม้ายค่อยได้แล้วเหมือนกัน
:lol:
I3alL_crack
06-09-2009, 10:47 AM
ถ้าเอาเท่าที่ ผมเรียนมานะ ครับ มันเป็นเรื่องของการ รับค่า ส่งค่าของฟังก์ชั่นอ่ะ ครับ
โดยมีหลักการว่า type Func (type variable)
จะเห็นว่ามีส่วนที่เป็น type อยู่ 2 ต่ำแหน่ง คือ ตำแหน่ง ด้านหน้า จะเป็นการส่งค่าของฟังก์ชั่น โดยฟังก์ชั่น นั้น จะสามารถส่งค่าได้ค่าเดียวเท่านั้น
ส่วนตัวด้านในวงเล็บนั้นหมายถึงการรับค่าของฟังก์ชั่นอ่ะครับ
main ก็เป็นฟังก์ชั่น ฟังก์ชั่นหนึ่งนะครับ มันเป็นฟังก์ชั่นหลัก ที่จำเป็นต้องมีอ่ะครับ
ยังไงก็ลองศึกษาเพิ่มเติม ตามหนังสือเอานะครับ
ผมก็กำลังศึกษาอยู่เช่นกัน ครับ มีอะไร ก็แชร์ ความรู้กัน แล้วกันครับ
StValentine
07-09-2009, 08:18 PM
**Hidden Content: Check the thread to see hidden data.**
benzautolove
07-09-2009, 08:25 PM
เรียนมาตั้งนานพึงจะเข้าใจมากกว่าเดิม ก็วันนี้
ขอบคุณมากครับ
Edkung_
07-09-2009, 11:29 PM
อ่านๆแล้ว ท่าทางน่าสนุก มาคุยกันมั่งดีกว่า
แต่..........ก็อีกนั้นแหละ มือใหม่จะใช้ void ก็ไม่มีใครว่า มันก็จะถูกปล่อยค่าreturn มันก็จะถูกปล่อยตามมีตามเกิดแหละครับ (หรือสำหรับcompilerบางตัวอาจจะบังคับเป็น 0 ให้)
แต่เป็นสักหน่อยแล้ว อยากจะขอนะครับว่า int main() นะครับ บางบอร์ดสอบC/C++ตามเมืองนอกเขาถือกันนะครับ
ถ้าใช้ void main() อาจจะโดนหาว่า noob
[/b]
อย่าทำ เพราะกลัวคนอื่นหาว่า noob ครับ แต่จงหาเหตุผลประกอบการทำ
โพสท์ไว้ว่า การที่โปรแกรมใดๆ เมื่อทำงานเสร็จแล้วก็ควรส่งค่า Return เป็น 0 เพื่อบอกว่าโปรแกรม
จบการทำงานอย่างสมบูรณ์ เป็นหลักการที่ยอมรับกันทั่วไป ผมก็เห็นด้วยว่าเป็นเรื่องที่ดี
แต่ก็มีบางคนแย้งว่า แล้วเจ้า OS มันทำอะไรบ้างกับ รีเทิร์นศูนย์ หรือไม่ศูนย์ (ซึ่งผมเองก็ไม่ค่อยเห็น
มีการทำอะไร นอกจากจะมีไดอะล็อกถามว่าจะให้ส่ง Report ไปให้ไมโครซอฟท์ช่วยตรวจสอบให้หรือปล่าว?
ในบางครั้งเท่านั้น) [/b]
มันไม่ส่ง report ไปให้ microsoft หรอกครับ -_-'' เพียงแต่มันมีวิธีเรียกเพื่อดูค่าได้ว่า โปรแกรมนั้นๆ ถูกปิดไปแบบไหนโดยการใช้ API อีกทอดนึง ยกตัวอย่างเช่น ใน Windows API จะมี API ที่่่ชื่อว่า GetExitCodeProcess เพื่อใช้ในการ Get ค่าของ ExitCode ของ Process นั้นๆ (อ่านเพิ่มเติมได้ที่ http://msdn.microsoft.com/en-us/library/ms...8VS.85%29.aspx) (http://msdn.microsoft.com/en-us/library/ms683189%28VS.85%29.aspx))
ดังนั้นจึงควรมีการ Return ค่าเอาไว้ด้วย (แต่ถ้าไม่คิดอะไรมากก็ void ไปนั่นแหละ) เพื่อที่เราจะได้สามารถตรวจสอบได้ว่า Program หรือ Process ของเราทำงาน แล้วจบ ได้อย่างถูกต้องหรือไม่
ที่ผมเรียนมาถ้าจำไม่ผิดมันเกี่ยวกับการ return ค่า ยังไงสักอย่างนี่หละครับ จำม้ายค่อยได้แล้วเหมือนกัน[/b]
Return Exit Code ครับ
เรียนมาตั้งนานพึงจะเข้าใจมากกว่าเดิม ก็วันนี้
ขอบคุณมากครับ[/b]
โปรดระวัง บอร์ดนี้ไม่สนับสนุนการพิมพ์ขอบคุณ
HazzA
18-10-2009, 05:28 PM
ก็พอมีความรู้บ้างเกี่ยวกับการเขียนภาษาพวกนี้นะครับ ก็อยากจะอธืบายตามความรู้ของผมว่า
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 นั่นเองครับ
อาจจะพอช่วยได้บ้างนะ
ผิดพลาดอย่างไรก็ขออภัยด้วยครับ
fftmj
03-11-2009, 11:08 AM
ตามความคิดของผมน่ะ เนื่องจาก ภาษา ซี และ ซีบวกบวก
บังคับไว้แล้วว่าต้องมีการ รีเทินร์ค่า เพื่อตรวจสอบการทำงาน
ซึ่งปกติแล้วจะส่งคืน ค่า 0 หรือ EXIT_SUCCESS ถ้าโปรแกรม
ทำงานจบ ซึ่งก็รวมไปถึงการประกาศ void หน้า main ที่จริงๆแล้ว
ก็มีการแอบส่งค่าออกไปเหมือนกัน ซึ่งถ้าเกิด ดวงแตก สิ่งที่รีเทินร์
ออกไปทำให้ OS เข้าใจผิด ว่าโปรแกรมทำงานผิดพลาดล่ะ
คิดดูว่าจะเกิดอะไรขึ้น ดีบักตาเหลือก เลย :blink:
ผมมี ลิงค์ดีๆ เกี่ยวกับเรื่องนี้ รออ่านดูน่ะครับ
แปลให้ไม่ไหว เพราะ ภาษา ตังเองก็ไม่เก่งมาก อ่านเข้าใจ เพราะดูโค๊ด
http://users.aber.ac.uk/auj/voidmain.shtml
triker
14-12-2009, 12:30 AM
ขอเพิ่มอีกนิดนะคะ
แนะนำว่าควรใช้ return EXIT_SUCCESS;
มากกว่า return 0; ค่ะ
เพราะว่า os บางตัวอาจจะไม่ได้ return 0 ตอนจบ function ก็ได้ (ถึงแม้ส่วนใหญ่จะใช้ก็เถอะ) เพราะฉะนั้นการใช้ return EXIT_SUCCESS; จะปลอดภัยกว่าค่ะ
อีกอย่าง มันชัดเจนกว่าด้วยว่า "เอาล่ะ เราจบการทำงานแล้วนะ"
ต้อง #include <stdlib.h> ด้วยนะค่ะ (ส่วน c++ นี่ไม่แน่ใจว่าต้อง #include อะไร)
triker
14-12-2009, 12:30 AM
ขอเพิ่มอีกนิดนะคะ
แนะนำว่าควรใช้ return EXIT_SUCCESS;
มากกว่า return 0; ค่ะ
เพราะว่า os บางตัวอาจจะไม่ได้ return 0 ตอนจบ function ก็ได้ (ถึงแม้ส่วนใหญ่จะใช้ก็เถอะ) เพราะฉะนั้นการใช้ return EXIT_SUCCESS; จะปลอดภัยกว่าค่ะ
อีกอย่าง มันชัดเจนกว่าด้วยว่า "เอาล่ะ เราจบการทำงานแล้วนะ"
ต้อง #include <stdlib.h> ด้วยนะค่ะ (ส่วน c++ นี่ไม่แน่ใจว่าต้อง #include อะไร)
witcomram
15-12-2009, 08:34 PM
ในการเขียนmainนั้น อย่างง่ายๆ เขียนได้ 2 แบบคือ อ้างอิงภาษาC++
void main //หมายถึงไม่มีค่าที่ต้องส่งกลับไปใช้ต่อแล้ว
เช่น
void main()
{
cout<<"Hello"<<endl;
}
ค่าที่เครื่องทำงานจะโชว์ทางหน้าจอว่า Hello แบบที่2
int main()
{
cout<<"Hello"<<endl;
return 0;
}
ผลการทำงานเหมือนกัน แต่เนื่องจากเป็น int จึงต้องคืนค่ากลับเป็น0
:lol:
witcomram
15-12-2009, 08:34 PM
ในการเขียนmainนั้น อย่างง่ายๆ เขียนได้ 2 แบบคือ อ้างอิงภาษาC++
void main //หมายถึงไม่มีค่าที่ต้องส่งกลับไปใช้ต่อแล้ว
เช่น
void main()
{
cout<<"Hello"<<endl;
}
ค่าที่เครื่องทำงานจะโชว์ทางหน้าจอว่า Hello แบบที่2
int main()
{
cout<<"Hello"<<endl;
return 0;
}
ผลการทำงานเหมือนกัน แต่เนื่องจากเป็น int จึงต้องคืนค่ากลับเป็น0
:lol:
KoIzJA
17-12-2009, 02:04 AM
1 ไม่มีการส่งผ่านค่าระหว่าง main กับฟังก์ชั่น
prototype
void name();
function definition
void name()
{
}
การเรียกใช้โดยฟังก์ชั่น main
name( );
2 ไม่มีการส่งผ่านจาก main แต่มีการส่งค่ากลับ
prototype
int name();
function definition
int name()
{
}
การเรียกใช้โดยฟังก์ชั่น main
int z = name( );
3 มีการส่งผ่านจาก main แต่ไม่มีการส่งค่ากลับ
prototype
void name(int x);
function definition
void name(int x)
{
}
การเรียกใช้โดยฟังก์ชั่น main
name( x );
4 มีการส่งผ่านจาก main และมีการส่งค่ากลับ
prototype
int name(int x);
function definition
int name(int x)
{
}
การเรียกใช้โดยฟังก์ชั่น main
int z = name(x);
เป็นรูปแบบการส่งค่า function อะครับ ถ้าผิดพลาดประการใดก็ขออภัยด้วย
KoIzJA
17-12-2009, 02:04 AM
1 ไม่มีการส่งผ่านค่าระหว่าง main กับฟังก์ชั่น
prototype
void name();
function definition
void name()
{
}
การเรียกใช้โดยฟังก์ชั่น main
name( );
2 ไม่มีการส่งผ่านจาก main แต่มีการส่งค่ากลับ
prototype
int name();
function definition
int name()
{
}
การเรียกใช้โดยฟังก์ชั่น main
int z = name( );
3 มีการส่งผ่านจาก main แต่ไม่มีการส่งค่ากลับ
prototype
void name(int x);
function definition
void name(int x)
{
}
การเรียกใช้โดยฟังก์ชั่น main
name( x );
4 มีการส่งผ่านจาก main และมีการส่งค่ากลับ
prototype
int name(int x);
function definition
int name(int x)
{
}
การเรียกใช้โดยฟังก์ชั่น main
int z = name(x);
เป็นรูปแบบการส่งค่า function อะครับ ถ้าผิดพลาดประการใดก็ขออภัยด้วย
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions Inc. All rights reserved.