วันศุกร์ที่ 21 พฤศจิกายน พ.ศ. 2557

int main() กับ void main ต่างกันอย่างไร



วันนี้ผมได้เจอโจทย์ข้อนึงมีเนื้อความตามนี้ครับ
//Ques.) 
//How many times the program will print "IndiaBIX" ? 
 #include 

 int main() 
printf(" Learn Programming "); 
main(); 
return 0; 

//A. Infinite times 
 //B. 32767 times 
//C. 65535 times 
 //D. Till stack overflows


ทำไห้ผมสงสัยแล้วมานั่งคิดว่าเอ๊ข้อนี้จะตอบอะไรดีจึงไปนั่งเปิดหนังสือ+ถามพี่ๆ ตอนแรกผมคิดว่า ประกาศmainเป็นint แฮะมันแปลก ๆเพราะปรกติแล้วประกาศเป็น void main()ก็ได้ผมจึงตั้งข้อสงสัยว่า int เก็บค่าได้ -32,768 ถึง 32,767 ซึ่งมันคือ 65535 ตัว ผมเลยคิดว่าน่าจะตอบข้อC แต่พอไปนั่งอ่านดี ๆ ความแตกต่างของ int main() กับ void main() คือ
int main()จะรีเทรินค่า แต่ void main() จะไม่รีเทรินค่า
int main()เราสัญญากับคอมไพเลอร์ว่า หลังจากทำงานเสร็จ ส่วน void main()สัญญากับคอมไพเลอร์ว่าเราจะไม่ส่งอะไรมาให้


จึงจบการงงตรงนี้เสียทีสรุปแล้วตัดข้อBกับCไปได้เลยเพราะว่ามันไม่เกี่ยวเลยการใช้INTหมายถึงค่าที่รีเทรินออกมาจองไว้มีขนาด=int แค่นั้นเอง ไม่เกี่ยวกับการทำrecursive function จึงจบบทสรุปนี้ไปได้

จากนั้นผมจึงลองรันโปรแกรมไห้มันนับเองเลยจากโค้ด

#include 

 int counter; 
int main() 
{
 counter++; 
printf(" IndiaBIX %d", counter); 
 main(); 
 return 0; 
 }


ผมทดลองได้4847 ครั้งครับ จึงไปถาม อ. ได้คำตอบว่า "การรัน Command แต่ละครั้ง มันขอ RAM มาจำนวนหนึ่ง (ปกติในดอส ก็ 640 kB)" มันจึงสุดแค่นี้

ส่วนการเขียนโปรแกรม recursive function จะรันบน stack แล้วผมจึงมาพิจารณาดูว่า recursive function จากโจทย์ข้างต้น มันไม่มีที่สิ้นสุดแปลว่า จะเกิดเหตุการณ์stack overflows ผมจึงตอบข้อD
เป็นอะไรที่เหนื่อยและได้ความรู้ดีครับถึงจะเป็นเรื่องพื้นฐานแต่ชวนคิดได้ทีเดียว

ไม่มีความคิดเห็น:

แสดงความคิดเห็น