ความสำพันธ์ระหว่างตัวแปรและชนิดข้อมูล
มันจะแสดงออกมาในรูปแบบ การประกาศตัวแปร คือ ในการประการตัวแปรขึ้นมาใช้งานแต่ละครั้ง จำเป็นต้องกำหนดชนิดข้อมูลของตัวแปรนั้นด้วย การกำหนดชนิดข้อมูลให้กำตัวแปรใดๆ ต้องคำหนึ่งถึง ขนาดของข้อมูลในการที่จะเก็บหรือใช้ เพราะท่าเล็กเกินไป program จะ error ได้ และท่าใหญ่เกินความจำเป็นก็จะทำให้กินเนื้อที่เกินความจำเป็น การเลือกชนิดตัวแปรนั้นมีความสำคัญมาก ต้องเลือกให้ดีนะครับรูปแบบการประกาศตัวแปร
ชนิดตัวแปร ตัวแปร; | |||
รูปแบบ | |||
int a =1; char ch[4]='one'; printf("%d - %d =%s",2,a, ch); |
เช่น
char ch; เป็นการประการตัวแปร ch ให้เป็นชนิดข้อมูลแบบตัวอักษร
int num; เป็นการประการตัวแปร num ให้เป็นชนิดข้อมูลแบบตัวเลขจำนวนเต็ม
float as; เป็นการประการตัวแปร ac ให้เป็นชนิดข้อมูลแบบตัวเลขจำนวนจริง(ทศนิยม มี6 หลักด้วย ^^)
การกำหนดค่าให้กับตัวแปร
นอกจากการประการตัวแปรแล้วเรายังกำหนดค่าให้มันได้ด้วยนะครับchar ch ='a'; | /* ประกาศตัวแปรพร้อมกำหนดค่าเริ่มต้น |
int num=10; | ให้กับตัวแปรด้วย |
float avg=14.66564; | */ |
char ch; | /* |
int num; | ประกาศตัวแปรก่อน |
float avg; | แล้วกำหนดค่า |
ch='a'; | ให้ตัวแปรที่หลัง |
num='10'; | |
avg=23.22234; | */ |
int num1, num2=0; | /*ทำการปรกาศตัวแปร num1 และ num2 ขึ้นมา ให้ตัวแปรสองตัวนี้เป็นชนิดข้อมูล |
แบบเลขจำนวนเต็ม และให้ num2 มีค่าเริ่มต้นเป็น 0*/ | |
ประเภทตัวแปร
ตัวแปรที่เราประกาศขึ้นนั้นสามารถแบ่งออกได้เป็น 2 ประเภทดั้งนี้
ตัวแปรแบบโกบอล(Global Variable)
คือตัวแปรที่ประกาศขึ้นภาคนอกฟังก์ชั่นทุกฟังก์ชั่น เมือตัวแปรอยู่นอกฟังก์ชั่น ก็ หมายความว่าเป็นตัวแปร สาธารณะ ไม่มีฟังก์ชั่นใครเป็นเจ้าของ ดังนั้นทุกฟังก์ชั่นเลยสามารถเรียกใช้ได้
ตัวแปรแบบโลคอล(Local Variable)คือตัวแปรภายในฟังก์ชั่น เป็นตัวแปรที่มีฟังก์ชั่นใดรฟังก์ชั่นหนึ่งเป็นเจ้าของ คือมันอยู่ในฟังก์ชั่นใด ฟังก์ชั้นนั้นจะเป็นเจ้าของตัวแปรนั้น และฟังก์ชั้นอืนไม่สามารถเรียกใช้ได้
ตัวอย่างแสดงการใช้งาน Global และ Local
1: | #include<stdio.h> | |
2: | ||
3: | int num=10; | |
4: | ||
5: | int testver(int x){ | |
6: | int n = 4, sum=0; | |
7: | sum = n * x ; | |
8: | return sum; | |
9: | } | |
10: | ||
11: | void main(){ | |
12: | int xnum; | |
13: | printf("Global var num is %d\n",num); | |
14: | xnum=testver(num); | |
15: | xnum=xnum * n; | |
16: | printf("Local var is %d\n",x); | |
17: | } |
ผลลัพธ์โปรแกรม | ||
คอมไพล์ไม่ผ่าน |
เพราะบรรทัดที่15 ครับที่ทำให้เกิดการErrorของโปรแกรม รู้ใหมว่าทำไมมาดูกันเถอะ
อธิบายโปรแกรม
บรรทัดที่ 3 : ประกาศตัวแปร num เป็น global veriable ซึ่งทุกฟังก์ชั้นสามารถเรียกใช้ได้Error : Undefined symbol 'n' in function main
บรรทัดที่ 6 : ประกาศตัวแปร n และ sum เป็น Local veriable ซึ่งเจ้าของตัวแปร n และ sum มีฟังก์ชั่น testver() เป็นเจ้าของ เพราะฉนั้น จะมีแค่ testver() เท่านั้นที่ใช้ได้
บรรทัดที่ 12: ประกาศตัวแปล xnum เป็น Local veriable ซึ่งจะใช้ได้แค่ Function main() เท่านั้น
บรรทัดที่ 14: เป็นการเรียกใช้เรียกใช้ Function testver() โดยส่งพารามิเตอร์เป็นเลขจำนวนเต็มเข้าไปใน Function โดยตัวที่ส่งไปคือค่าของ num นั้นเอง
บรรทัดที่ 5 : function testver() รับค่าเลขจำนวนเต็ม num ซึ่งมีค่าเท่ากับ 10 เข้ามาใน Function จากนั้นก็นำไปคูณกับ n ที่เป็นตัวแปลโลคอลได้ผลเท่ากับ 40 แล้วเก็บค่าไว้ที่ตัวแปร sum แล้วค่อยส่งค่ากับสู่ function main() ในบรรทัดที่ 14
บบรทัดที่ 15: พอถึงตรงนี้โปรแกรมก็เกิดปัญหาเพราะ เราเรียกใช้ ตัวแปลแบบ Local ของ Function testvar() คือตัว n นั้นเองครับ โดยมันจะแสดงว่า
ท่าอยากให้โปรแกรมนี้แสดงผล ผู้อ่านลองแก้ code program ดูครับ ^_^
Storage Class คือ
Storage Class เป็นสิ่งที่ใช้กำหนดขอบเขตการทำงานของตัวแปรว่าจะให้ใครเข้ามาใช้ได้ ไม่ได้ เรื่องของเวลาในการทำงาน ว่าจะให้โปรแกรมเก็บค่าของตัวแปรไว้นานเท่าใด โดยๅ Storge Class แบ่งออกเป็น 4 ประเภท ตามภาพนี้
auto ใช้ในการประกาศ automaatic variable ก็คือตัวแปรแบบ local นั้นเอง ตัวแปรประเภทนี้เป็นตัวแปรทั้วไป เช่นเมื่อเราประกาศว่า
int a =2; float b=1.33; |
ทั้ง a และ b ก็จะถูกกำหนดใหนเป็น automaatic variable เลยทันทีโดย อัตโนมัติ มีความหมายเป็น
auti int a =2; auto float b=1.33; |
โดยทั่วไปเราไม่จำเป็นต้องระบุ auto ก็ได้เพราะ มันจะเป็น automaatic variable ให้โดยอัตโนมัติ อยู่แล้ว ซึ่งตัวแปรประเภทนี้จะใช้งานได้แค่ในฟังก์ชันตัวเองเท่านั้น เพราะมันจะถูกสร้างขึ้นเมื่อเข้ามาใน function แล้วจะถูกทำลายทิ้งไปโดยอัตโนมัติ เมื่อออกจาก function จึงเป็นเหตุที่ให้ function อืนใช้งานตัวมันไม่ได้ ครับ
extern เอาง่ายๆเลยนะมันคือตัวแปรแบบ Globle นั้นเอง ทุกฟังก์ชั่นมองเห็นและใช้งานได้ แต่จะเป็นตัวแปรที่มีการประกาศใช้งานอยู่ในfile อื่นนะครับ โดยการระบุ extern ไว้ข้างหน้าชนิดของตัวแปรเพื่อทำการอ้างอิงไปยังตัวแปรนั้น
ตัวอย่างเพื่อแสดงการทำงานของ extern
1: | //test.c | |
2: | ||
3: | #include<stdio.h> //#include คือการนำเข้าของไฟล์ | |
4: | #include"sum.c" | |
5: | int n=10; | |
6: | main(){ | |
7: | showprint(); | |
8: | } | |
1: | //sum.c | |
2: | ||
3: | #include<stdio.h> | |
4: | extern int n; //บรรทัดนี้ได้อ้างอิงไปยังบรรทัดที่ 5 ของไฟล์test.c | |
5: | void showprint(){ | |
6: | printf("Number sum is %d\n",n+5); | |
7: | } |
ผลลัพธ์โปรแกรม | ||
Number sum is 15 |
Static มันอาจจะเป็นตัวแปรแบบGlobal หรือ Local ก็ได้ แต่ที่นิยมกันมาที่สุดก็จะให้มันเป็นแบบ Local โดย static มันจะถูกสร้างขึ้นเมื่อเริ่มโปรแกรม และถูกทำเมื่อจบโปรแกรม ยำ จบโปรแกรม ไม่ใช้ ฟังก์ชั่น อย่าไปงงกับ ตัวแปรชนิด auto นะครับ เพราะเหตุนี้ แม้มันจะออกจากฟังก์ชั่นค่าของมันก็จะไม่ถูกลบทิ้ง และเมื่อมันกลับเข้ามาอีกทีค่าก็จะเป็นค่าเดิมที่ก่อนออกฟังก์ชั่น เดียวไปดูตัวอย่างดีกว่าจะได้เข้าใจง่ายๆ
//test static | //test auto | |
#include <stdio.h> | #include <stdio.h> | |
void step(void); | void step(void); | |
void main(){ | void main(){ | |
int i; | int i; | |
for(i=0;i<5,i++){ | for(i=0;i<5,i++){ | |
step(); | step(); | |
} | } | |
void step(){ | void step(){ | |
static int a=0; | auto int b=0; | |
a++; | b++; | |
printf("a = %d\n",a); | printf("b = %d\n",b); | |
} | } | |
ผลลัพธ์โปรแกรม | ผลลัพธ์โปรแกรม | |||||
a = 1 a = 2 a = 3 a = 4 a = 5 | b = 1 b = 1 b = 1 b = 1 b = 1 |
อธิบายโปรแกรม
ตัวแปร a เป็น static variable และ ตัวแปร b เป็น auto variable จากผลลัพธ์จะเห็นได้ว่า ตัวแปร b จะเป็นค่าเดิมใหการแสดงทุกครั้ง เพราะทุกครั้งเมื่อออกจากฟังก์ชั่น step() จะโดนทำลายทิ้งไปทุกครั้ง จะไม่มีการเก็บค่าเดินไว้ที่ตัวแปร b เลย คือ เมื่อเข้าสู้ function ครั้งใดก็จะ รีเซ็ตค่าตัวแปรทุกครั้ง ส่วนตัวแปร a ซึ่ง เป็น static variable นั้นค่าเพิ่มขึ้นครั้งละ1 เป็นเพราะเมือมันออกจาก function มันไม่ได้มีการ ทำลายทิ้ง คือ เมื่อกลับเข้าไปใน function อีกครั้ง มันก็จะเริ้มจากค่าที่ออกจาก function ครั้งล่าสุด เพราะมันไม่มีการรีเซต จนกว่าจะจบ โปรแกรมครับ
regiter การประกาศ ตัวแปร regiter นั้นเป็นการประกาศตัวแปรเพื่อจัดเก็บในความจำรอง(รีจิสเตอร์) ซึ่งต่างจากที่ผ่านมา(พวกนั้นเป็นความจำหลัก) โดยตัวการประกาศตัวแปรประเภทนี้ จะทำให้สามารถเข้าถึงได้ตัวแปรได้เร็วกว่าตัวแปรที่เก็บในหน่วยความจำหลัก เนื่องจากรีจิสเตอร์เป็นหน่วยความจำที่อยู่ภายใน CPU แต่ควรระหวังในการใช้ด้วยเพราะอาจทำให้ รีจิสเตอร์ เต็ม จากจะทำให้โปรแกรมที่เขียนนั้นเร็ว กลับกลายเป็นช้าได้นะครับ
มาดูConstabt (ค่าคงที่)กันหน่อย
ค่าคงที่สามารถจำแนกได้3 ประเภท คือ Literal,Defined,Memory เรามาดูว่าแต่ละอย่างทำน่าที่อย่างไรนะครับLiteral constant
คือ ค่าคงที่ที่เป็นข้อมูลที่แน่นอน ค่าคงที่พวกนี้ไม่จำเป็นต้องมีตัวแปลมาลองรับ สามากำหนดเข้าไปได้เลยครับ ดูภาพนี้เพื่อความเข้าใจ
Defined costant
เป็นค่าคงที่ซึ่งต้องกำหนดในส่วนหัวของโปรแกรมในลักษณะของ Preprocessing Directives เช่น
#define NUM_MAX 10 |
1: | #include<stdio.h> | ||
2: | #define NUM_MAX 10 | ||
3: | /*เทียบได้กับ | ||
4: | main(){ | ||
5: | int i; | ||
6: | for(i=0;i< NUM_MAX;i++){ | for(i=0;i<10;i++){ | |
7: | printf("%d\n",i); | printf("%d\n",i); | |
8: | } | } */ | |
9: | } | ||
บรรณทัดที่ 2 : กำหนด define constant ชื่อ NUM_MAX ให้มีค่าเป็น10
บรรณทัดที่ 6 : เป็นการเรียกใช้ NUM_MAX ซึ่งมีค่าเทียบเท่า10
ข้อความจำ | ||
การตังชื่อให้กับ defined constant นั้นจะต้องเป็นไปตามหลักของภาษาซี และส่วนมากจะนิยมตั้งชื่อให้เป็นตัวใหญ่เพราะจะได้ดูง่ายครับ และที่สำคัญคือค่า defined constant นี้มันจะใช้แทนค่าตามที่เรากำหนดให้ช่วงต้นเท่านั้นครับ จนกว่าจะจบโปรแกรม ครับ |
เป็นการกำหนดรูปแบบของตัวแปร ซึ่งเมื่อทำการกำหนดค่าในลักษณะนี้แล้วตัวแปรที่ถูกกำหนดค่าจะมีค่าตามที่เรากำหนดไปจนกว่าจะจบโปรแกรมนั้นเลยครับซึ่งเราจะไม่สามารถเปลี่ยนแปลงค่านั้นไม่ได้เลยครับ รูปแบบการกำหนดก็เป็นไปตามนี้
const int x = 10; | |||
รูปแบบ | |||
1: | #include<stdio.h> | |
2: | ||
4: | main(){ | |
5: | const int x = 10; | |
6: | printf("You num memory constant :%d",x); | |
7: | x = 200; | |
8: | printf("You num memory constant :%d",x); | |
9: | ||
10: | } |
ซึ่งท่าดุแบบ ผิวเผินโปรแกรมนี้ผลของโปรแกรมน่าจะออกมาเป็น ตามนี้ใช่ประครับ
You num memory constant :10 |
You num memory constant : 200 |
ข้อความจำ | ||
ข้อควรระวัง คือ การกำหนดรูปแบบ ค่าคงที่แบบ Defined constant อาศัยหลักการทำงานของ Processing Directives ดั้งนั้นค่าที่กำหนดที่ส่วนหัวของโปรแกรมเท่านั้น ส่วน รูปแบบของ Memory constant จะถูกกำหนดในFunction ด้วย keyword const การเรียกใช้ควรระมัดระวังเพราะอาจจะทำให้สับสนได้ ครับ #include<stdio.h> #define ST 42.111 // Defined Constant main(){ const int n = 20; //Memory Constant } |
0 ความคิดเห็น:
แสดงความคิดเห็น