ขอบเขตของตัวแปรในภาษา C++ (Scope of variables In C++)

ตัวแปรทั้งหมดที่เราทำการประกาศค่าไว้ก่อนแล้ว นั้นในภาษา C++ การประกาศค่าตัวแปรจะทำที่ใดของ source code ก็ได้ และระหว่างการประกาศตัวแปรนั้น แต่ละขอบเขตของฟังค์ชัน ( Scope of Function ) นั้นถึงแม้จะชื่อเหมือนกัน แต่ว่าก็ไม่ได้หมายความว่าจะเป็นตัวแปรจะค่าเหมือนกันแต่อย่างใด ซึ่ง ตัวแปร A ที่อยู่ใน ฟังค์ชัน X จะไม่เท่ากับค่าของตัวแปร A ที่อยู่ในฟังค์ชัน Y แต่อย่างใด เพราะว่าอยู่กันคนละขอบเขตกันเราเรียกตัวแปรในขอบเขตแบบนี้ว่า ตัวแปรเฉพาะที่ (ในบทความนี้ขอพูดทับศัพท์ไปเลย เพื่อให้เข้าใจง่ายว่า Local Variables) ซึ่งจะมีค่าและสามารถใช้งานได้เฉพาะฟังค์ชัน ที่มันเกิดร่วมด้วยเท่านั้น


ตัวอย่าง 1

int X () {

   int A = 5;

   return A;

}

int Y () {

   int A = 10;

   return A;

}

int main() {

   std::cout < < X()<< ”;

   std::cout << Y()<< ”;

   return 0;

}


ผล

5 10


ในบางครั้งการเขียนโปรแกรมแบบประกาศตัวแปรภายนอกฟังค์ชัน ไม่ว่าจะที่ใดก็ตาม มันจะเป็น ตัวแปรสากล (ในบทความนี้ขอพูดทับศัพท์ไปเลย เพื่อให้เข้าใจง่ายว่า Global Variables) ไปทันที ซึ่งจะทำให้การประกาศแบบ ตัวแปร A มีค่าค่าหนึ่งในฟังค์ชัน X และตัวแปร A มีค่าอีกค่าหนึ่งในฟังค์ชัน Y จะทำแบบนี้ไม่ได้ เพราะว่าถูกการประกาศไว้แล้ว ภายนอกฟังค์ชัน ในภายนอกฟังค์ชันนั้นเอง ทำให้การที่ใช้ตัวแปรนั้นๆ ที่ประกาศไว้นอกฟังค์ชันไปใช้อาจทำให้เกิดการคำนวณหรือการทำงานที่ผิดพลาดได้


ตัวอย่าง 2

int x = 5; // Global Variable

int main() {

   double y = 3.1415; // Local Variable

   std::cout < < y << ”; std::cout << x << ”; return 0;

}


ผล

3.1415 5


แต่ ……

มันยังมีข้อที่เรามองข้ามไปคือ ถ้าเราประกาศตัวแปร เหมือนกับ Global Variable แล้วนั้น จะทำให้ตัว Compiler มองว่าตัวที่ประกาศอยู่ในฟังค์ชันคือตัวแปรที่มีความสำคัญหรือ ศักดิ์มากกว่า


ตัวอย่าง 3

int x = 5;

int main() {

   double x = 3.1415; /* ทำการซ่อน Global Variable x = 5 ไว้ */

   std::cout < < x << ”; /* แสดงตัวค่าตัวแปร Local Variable แทน */

   std::cout << ::x << ”;

   /* ใช้ Scope resolution operator มาวางให้ข้างหน้าตัวแปร

   เพื่อบ่งบอกว่าเราต้องการใช้ตัวแปร Globale Variable

   แทน Local Variable*/

   return 0;

}


ผล

3.1415 5


จากตัวอย่างจะเห็นว่าเราจะทำการประกาศตัวแปรทับซ้อนกันก็ได้ได้แต่ว่าไม่เป็นผลดีและอาจเกิดการสับสนใจการใช้งานได้ ทำให้ส่วนใหญ่แล้วจะใช้ Local Variable กันเยอะมาก เพราะว่าจัดการได้ง่าย แต่ก็มีในหลายๆ กรณีเช่นกันที่ต้องใช้ อย่างเช่นตัวแปรที่ต้องการแชร์ค่าเริ่มต้นการทำงานเช่นค่าของ Percen (100) หรือ ค่าของ Pi (3.1415) เป็นต้น เพราะเป็นค่าที่ไม่มีการเปลี่ยนแปลงไม่ว่ากรณีใดๆ

Note !

คุณสามารถที่จะบอก Compiler ว่าคุณต้องการใช้ Global Variables แทนการใช้ Local Variable ได้เมื่อคุณตั้งชื่อ Variable ภายใน Function นั้นเหมือนกับ Global Variable โดยใช้ :: (The Scope Resolution Operator) ไว้ด้านหน้าตัวแปรนั้นๆ …

:: identifier

class-name :: identifier

namespace :: identifier

ซึ่งการอ้างถึงของ :: (The Scope Resolution Operator) นั้นสามารถอ้างได้ตั้งแต่ variable, class และnamespace ได้ด้วย

ซึ่งจาก "ตัวอย่างที่ 3" ถ้าคุณมี Nested Local Scopes (มี Scope ตัวแปรซ้ำซ้อนกับ Global Variable ) ตัว Compiler จะไปเอาค่าหรืออ้างอิงตัวแปรที่อยู่ใน Function ก่อนเสมอ ถ้าจะใช้ Global Variable ก็เพียงทำหลักการของ The Scope Resolution Operator นั้นเอง

จากที่เราได้รู้แล้วว่า คำว่า Global Variables นั้นสามารถที่จะอ้างอิงได้จากทุกๆ ที่ใน code หรือใน ฟังค์ชัน ซึ่งจะคงอยู่ตลอดหลังจากการตั้งตัวแปรนั้นๆ ขึ้นมาใช้งานแล้ว แต่คำว่าตัวแปรเฉพาะที่ Local Variables นั้นตัวแปรจะถูกจำกัดอยู่ในขอบเขตที่ตัวเองได้เกิดขึ้น แต่ถ้าคุณสร้างมันในตอนแรกของฟังค์ชัน (ในที่นี่หมายถึง main ฟังค์ชันของ C++) ตัวแปรนั้นๆ จะอยู่ใน main ฟังค์ชันเท่านั้น และจะไม่ไปยุ่งกับตัวแปรอื่นๆ ในฟังค์ชันอื่นๆ ด้วยถึงแม้ชื่อจะเหมือนกันในฟังค์ชันอื่นๆ ก็ตามที

ใน C++ นั้น ขอบเขต ของ Local Variables นั้นจะอยู่ที่ ( brackets { } signs ) นั้นเอง ซึ่งถ้าคุณตั้งมันในขอบเขตดังกล่าวแล้ว ตัวแปรจะไม่ยุ่งเกี่ยวกับภายนอกฟังค์ชันแน่นอน


ตัวอย่าง 4

int main(){

   for (int i = 0; i < 100; ++i) {

      int x = 42;

      if (x < i) {

         double x = 3.14; std::cout << x; // Output ที่จะ Print ออกมาจากหน้าจอคือ 3.14

      }

      std::cout << x; // Output ที่จะ Print ออกมาจากหน้าจอคือ 42

      } // ส่วนนี้จะ Error เพราะว่าเราไม่ได้ตั้งตัวแปรไว้ในขอบเขตนี้ ด้วยเหตุผลได้กล่าวไปแล้วในข้างต้น

   std::cout << x;

   return 0;

}


จากเนื่อหาด้านบนคงทำให้หลายๆ คนเห็นภาพมากขึ้นในเรื่องของขอบเขตของตัวแปรในภาษา C++ นะครับ

อ้างอิงจากหนังสือ C++ in a Nutshell ของ O’Reilly


การเซ็ตให้ Borland C++ Compiler 5.5 ทำงานร่วมกับ EditPlus เพื่อทำการ Compile ไฟล์ที่เขียนขึ้นด้วยภาษา C++

สิ่งที่ต้องมี

  • Borland C++ Compiler 5.5
  • EditPlus

1. ดาวน์โหลด Borland C++ Compiler 5.5 มาจากเว็บ Borland ที่ http://www.codegear.com/downloads/free/cppbuilder

2. ดาวน์โหลด EditPlus ได้จากที่นี่ http://www.editplus.com

3. เมื่อโหลดได้แล้วทำการติดตั้งดังภาพด้านล่างนี้ครับ


ภาพที่ 3-1


ภาพที่ 3-2


ภาพที่ 3-3


ภาพที่ 3-4


ภาพที่ 3-5

4. เปิด EditPlus ขึ้นมาแล้วไปที่ Tools ที่เมนูบาร์ แล้วไปที่ เมนู Configure User Tools


ภาพที่ 4-1

5. เข้ามาที่หน้าต่าง Preferences ตอนนี้เราจะอยู่ที่ Tools และหัวข้อย่อย User tools

  • ให้เราเลือกที่ Groups and tools items ไหนก็ได้ ในตัวอย่างเลือกอยู่ที่ Groups 4
  • กดปุ่ม Add Tool แล้วไปที่ Program


ภาพที่ 5-1

6. เราจะได้ New Program มา 1 อัน

  • เราสามารถเปลี่ยนชื่อได้โดยไปที่ Menu text ในที่นี้ให้เปลี่ยนเป็น “Borland C++ Compile
  • ในส่วนของ Command ให้ไป Browse ให้ชี้ไปที่ ไฟล์ bcc32.exe ซึ่งในที่นี้ถ้าติดตั้งตามแบบข้างต้น (ข้อที่ 3 ) จะได้ที่นี่ C:\Borland\BCC55\Bin\bcc32.exe
  • ในส่วนของ Argument ให้ใส่ตามข้างล่างนี้เลย ถ้าติดตั้งตามแบบข้างต้น (ข้อที่ 3 )
    -IC:\Borland\BCC55\Include -LC:\Borland\BCC55\Lib -n$(FileDir) $(FilePath)
  • จากข้อที่แล้วจะสังเกตที่ได้ขีดเส้นได้ว่าคือที่ ที่เราได้เซ็ตไว้ข้างต้นแล้วในตอนที่ติดตั้ง Borland C++ Compiler 5.5 ซึ่งในข้อที่ 3 เราได้กำหนดไว้ที่ C:\Borland\BCC55 นั้นเอง
  • ในส่วนของ Initial directory ให้กำหนดเป็น C:\Borland\BCC55\Bin
  • ให้ทำการทำเครื่องหมายถูกที่ Capture output ด้วย


ภาพที่ 6-1

7. ทำการกดปุ่ม Add Tool แล้วไปที่ Program เพื่อ New Program อีกหนึ่งอัน


ภาพที่ 7-1

8. ในขั้นตอนนี้เราจะทำ Menu Run กันในโปรแกรม EditPlus แต่มีข้อเสียอยู่อย่างเดียวคือ

เราจะไม่สามารถใช้กับโปรแกรมที่มีการรับ Argument ได้ ซึ่งทางผู้จัดทำเอกสารยังไม่ได้หาข้อมูลเพิ่มเติมแต่อย่างใด แต่สามาถ Compile ได้แต่จะมีวิธีการทำในภายหลังว่าจะทำยังไงให้สามารถ Run แล้ว สามารถให้โปรแกรมสามารถรับค่าได้

  • ที่ Menu text ให้เปลี่ยนจาก New Program เป็น Run
  • ที่ Command ให้ใส่ $(FileNameNoExt)
  • ที่ Initial directory ให้ใส่ $(FileDir)
  • ให้ทำการทำเครื่องหมายถูกที่ Capture output ด้วย


ภาพที่ 8-1

9. ต่อมาเรามาทำการเปลี่ยนชื่อ Groups 4 ให้เป็น C++ Compile ก่อนเพื่อจะได้ไม่สับสน

  • ไปที่ Group Name
  • แล้วทำการเปลี่ยนชื่อเป็น C++ Compile
  • กด OK เพื่อยืนยันการเปลี่ยนแปลง


ภาพที่ 9-1

10. แล้วกด OK ออกมาจาก หน้าต่าง Preferences

11. เขียนโปรแกรม ง่ายๆ ทดสอบกันว่ามันทำงานหรือเปล่า

  • แต่ก่อนทำการ Compile และ Run ต้องทำการ Save ก่อนเพื่อจะได้ Run ได้
  • การ Save ที่ถูกต้องและจะทำให้ Compile ผ่านได้และไม่ผิดพลาด นั้นควรตั้งชื่อไฟล์ และการเก็บไฟล์ไว้ที่ Folder ที่ไม่มีช่องว่างในการตั้งชื่อ และชื่อต้องที่ไม่มีช่องว่างในการตั้งชื่อด้วย (แต่สามารถใช้ _ ในการเว้นระยะแทนได้) เช่น
    • D:\Ford\MyProgramming
    • D:\cpp
    • D:\cpp\test.cpp
    • D:\cpp\test_input.cpp
  • ไม่ควร Save ไว้ที่ Folder หรือตั้งชื่อไฟล์ที่มีช่องว่างระหว่างชื่อ, ชื่อเป็นภาษาอื่นนอกจากภาษาอังกฤษ, ชื่อมีเครื่องหมายพิเศษหรือ มีสัญลักษณ์พิเศษ เช่น
    • D:\Ford\My Programming
    • D:\Ford\My OOP
    • D:\Ford\My Cpp
    • D:\Ford\My C(pp)
    • D:\cpp\tes#t.cpp
    • D:\cpp\test input.cpp
  • เราก็เขียนโปรแกรมง่ายๆ ดังภาพด้านล่างนี้ ……… และ Save ไว้ที่ D:\test.cpp


ภาพที่ 11-1

12. เมื่อเรา Save แล้ว ก็ไปที่ Tools ที่เมนูบาร์ ไปที่ User Tool Groups แล้วเลือกที่ C++ Compile ที่เราได้เซ็ตกันเมื่อกี้นี้


ภาพที่ 12-1

13. เราก็จะได้เมนูใหม่เข้ามาคือ Borland C++ Compile และ Run ที่เราเซ็ตไว้เมื่อกี้นี้

  • ให้เรากดที่เมนู Borland C++ Compile เพื่อทำการ Compile


ภาพที่ 13-1

14. เราจะได้ผลลัพธ์ตามภาพ


ภาพที่ 14-1

15. แล้วถ้าเราจะ Run ให้ใช้ เมนู Run ดังภาพ


ภาพที่ 15-1

16. เราจะได้ผลลัพธ์ตามภาพ


ภาพที่ 16-1

17. เรามาเขียนโปรแกรมรับค่าและ วิธีการแก้ปัญหาของ EditPlus ที่ทำการ Run แบบรับค่าไม่ได้ (ภาพที่ 17-2)

  • จากโปรแกรมนี้นั้น จะมีการรับค่ามาหนึ่งค่า เราจะรวบรัดขั้นตอนในบางตอนไปเลย ซึ่งเมื่อเขียนโปรแกรมนี้เสร็จแล้วให้ทำการ Compile ตามวิธีเดิมข้างต้นไปได้กล่าวไปแล้ว แต่ไม่ต้องทำการ Run แต่อย่างใด มิเช่นนั้นแล้วโปรแกรม EditPlus จะมี Process ค้างและทำให้เครื่องมีปัญหาได้
  • แต่ถ้าไปเผลอ Run แก้โดยให้ทำการ ปิดโปรแกรม EditPlus แต่จะมี Dial Box ขึ้นมาถามว่าเราจะ Stop Process หรือไม่ ดังภาพภาพที่ 17-1 ให้ตอบ Yes ไป

ภาพที่ 17-1


ภาพที่ 17-2

18. ทางแก้ในด้านนี้คือใช้ Command Prompt นั้นเอง

  • ให้ไปที่ Start > Run
  • พิมพ์ cmd


ภาพที่ 18-1

19. ไปที่ ที่อยู่ไฟล์ที่เราได้ Compile ไว้

  • ซึ่งในการ Compile นั้นโปรแกรม Borland C++ Compiler 5.5 จะทำการ Build ไฟล์ที่เรา Compile เป็น Execute File ( .exe ) ให้เราแล้ว
  • เราเพียงแต่เข้าไปหาไฟล์ที่เรา Compile ไว้แล้วพิมพ์ชื่อไฟล์นั้นๆ ลงไปให้ตรงเท่านั้น
  • ในขั้นตอนนี้ควรมีความสามารถในการใช้คำสั่ง DOS


ภาพที่ 19-1

20. จากทั้งหมดที่ได้กล่าวไปเป็นการเซ็ตและการประยุกต์ใช้ในด้านการทำงานครับ ขาดตกเนื้อหาตรงไหนเมล มาสอบถามได้นะครับ หวังว่าคงได้ประโยชน์ไม่มากก็น้อยนะครับ