25. โปรแกรมตัวอย่าง
/* 7th Sample Program: Local vs Global Variable */
#include<stdio.h>
int ans = 0;
int inc_one(int); /* function prototype */
void main()
{
int a = 3;
ans = inc_one(a);
printf(“Answer is %dn”, ans);
}
/* function definition: return x+1 */
int inc_one(int x)
{
int ans;
ans = x + 1;
return ans;
}
26. สังเกตง่ายทีสุดคือตัวแปรภายนอก ans เพราะถูกประกาศเอาไว้ภายนอก
ฟ ังก์ชน โดยสามารถเรียกใช้งานได้โดยฟ ังก์ชนหลัก (main) หรือฟ ังก์ชนใดๆ
ั ั ั
สังเกตได้วาฟ ังก์ชนหลัก ใช้ตวแปร ans โดยไม่มการประกาศตัวแปร
่ ั ั ี
หากจะระบุวาตัวแปรใดเป็ นตัวแปรภายใน จะต้องพิจารณาทีละฟ ังก์ชน ในฟ ังก์ชน
่ ั ั
หลักตัวแปร a คือ ตัวแปรภายใน เพราะถูกประกาศในฟ ังก์ชนหลัก
ั
ในฟ ังก์ชน inc_one มีตวแปร x และ ans เป็ นตัวแปรภายใน ข้อสังเกต
ั ั
เพิมเติมคือ ans ทีประกาศขึนในฟ ังก์ชนนีมีชอเหมือนกับ ans ทีเป็ นตัวแปร
ั ื
ภายนอกของทังโปรแกรม อย่างไรก็ตามหากลองย้อนกลับไปดูนิยามก็จะพบว่าสามารถ
ทําได้ เพียงแต่วาในฟ ังก์ชน inc_one ได้ประกาศตัวแปร ans ขึนใหม่เป็ นตัวแปร
่ ั
ภายใน ใช้งานในฟ ังก์ชน inc_one เท่านันโดยไม่เกียวกับตัวแปร ans ซึงเป็ นตัว
ั
แปรภายนอก หากฟ ังก์ชน inc_one ไม่ได้ประกาศตัวแปร ans ขึนใหม่ ก็จะมา
ั
สามารถเรียกใช้ตวแปร ans ซึงเป็ นตัวแปรภายนอกได้เช่นเดียวกับฟ ังก์ชนหลัก
ั ั
27. ตัวอย่าง แสดงโกลบอลและโลคอล
PROGRAM AA;
VAR NUM:INTEGER;
PROCEDURE A; ผลทีได้จาการ RUN
BEGIN
NUM:=NUM*10; NUM*10 = 50
WRITELN(‘NUM*10 = ‘,NUM);
END; NUM = 124
VAR ANY:INTEGER;
PROCEDURE B; CNTR = 122
VAR NUM,CNTR:INTEGER;
BEGIN
BACK TO MAIN
NUM:=124; NUM = 50
WRITELN(‘NUM = ‘,NUM);
CNTR:=122;
WRITELN(‘CNTR =’,CNTR);
END;
BEGIN {MAIN PROGRAM}
NUM:=5;
WRITELN(‘IN MAIN’,’NUM = ‘,NUM);
A;
B;
WRITELN(‘BACK TO MAIN NUM = ‘,NUM);
END.
28. อธิบาย
- NUM ทีกําหนดในโปรแกรมหลักเป็ นโกบอล คือให้คาและ output ใน
่
โปรแกรมหลักและให้คาและ output ใน program ย่อย A
่
- NUM, cntr ทีกําหนดใน program ย่อย B เป็ นโลคอล B ซึงโปรแกรมหลัก
หรือโปรแกรมย่อยอืน ๆ จะนําไปใช้ไม่ได้ แต่ชอ NUM ซํากับ NUM ใน
ื
โปรแกรมหลัก จึงถือว่าเป็ นคนละ NUM กัน ทีโปรแกรมหลัก NUM=5 แต่พอถึง
A นํามาคูณ 10 ได้ 50 เมือถึง B ให้คาใหม่เป็ น 124 เมือกลับมาโปรแกรมหลักก็
่
เป็ น 124 แต่ยงเป็ น 50 เพราะเป็ น NUM คนละตัวกัน
ั
- ก่อน procedure B ได้กําหนดตัวแปร ANY ซึงเป็ นโกบอล แต่ใช้ใน
procedure A ไม่ได้ใช้ได้ใน procedure B และโปรแกรมหลัก
- เพราะฉะนัน B เรียกใช้ A แต่ A เรียกใช้ B ไม่ได้ และทัง A,B เรียกใช้ AA
ไม่ได้ เพราะเป็ นโปรแกรมหลัก