ชนิดข้อมูลพื้นฐาน และ การด...
TRANSCRIPT
ชนดขอมลพนฐาน และ การด าเนนการทเกยวของกบตวแปร (Primitive Data Type & Operations)
วตถประสงค - รจกชนดขอมลพนฐาน (Primitive Data Type) ของตวแปร - รจกการประกาศตวแปร (Variable) และ ตวแปรคงท (Constant) - รจกการเกบขอมลในตวแปร
- รจกความหมายของสญพจน (Literal)
- รจกตวด าเนนการ หรอ เครองหมายด าเนนการ (Operator)
- เขาใจนพจน (Expression) และ ล าดบการด าเนนการ (Precedence Order)
- Type Casting (การแปลงชนด)
- สามารถเขาใจโปรแกรมค านวณอยางงาย รบขอมลเขา และ สงขอมลออกอยางงาย ๆ ได
สวนใหญ ในการเขยนโปรแกรมภาษาใด ๆ ผเขยนโปรแกรมจ าตองประกาศตวแปร (หรอ เรยกวา จองหนวยความจ า) เพอใชในการทดชวคราว ซงตวแปรในภาษา Java มสองชนดใหญ ดงน
1. ชนดขอมลพนฐาน (Primitive Data Type) ใชเกบคาพนฐานตาง ๆ เชน เลขจ านวนเตม เลขทศนยม อกขระ และ ขอมลตรรกกะ และ
2. ชนดขอมลแบบอางอง (Reference Data Type) ตวแปรชนดนไมไดเกบขอมลของการค านวณเหมอนชนดแรก แตถกใชเกบคาอางองต าแหนงในหนวยความจ า เชน String และ ขอมล array
ในบทนเราจะมาพดถงขอมลชนดพนฐานกอน
ชนดขอมลพนฐาน (Primitive Data Type)
การด าเนนการทางคอมพวเตอรอาจประกอบไปดวยการด าเนนการยอยมากมาย โปรแกรมอาจมความ
จ าเปนตองเกบผลลพธของการด าเนนการยอยในหนวยความจ า เพอน ามาด าเนนการตอในขนถดไป นกพฒนา
โปรแกรมสามารถบอก Java ใหจองพนทในหนวยความจ าเพอเกบขอมลไดหลายวธ หนงในนนคอ การประกาศตว
แปรขนมาใช
ในการประกาศตวแปรในภาษา Java ผเขยนจ าเปนตองระบชนดของตวแปรทกครง เพอให compiler ร
ขนาดพนทหนวยความจ าทตองจอง ชนดขอมลพนฐาน (Primitive Data Type) ของตวแปรมดงน:-
Primitive Data Type
ค าอธบาย ขนาด [bits]
พสยของตวแปร (ชวงของคาทตวแปรแตละชนดสามารถเกบได)
boolean ใชเกบคาจรงหรอเทจ 8 true หรอ false byte ใชเกบคาตวเลขจ านวนเตม 8 -128 (-27) ถง 127 (27 – 1) short ใชเกบคาตวเลขจ านวนเตม 16 – 32,768 (-215) ถง 32,767 (215 – 1) int ใชเกบคาตวเลขจ านวนเตม 32 –2,147,483,648 (-231) ถง 2,147,483,647 (231 – 1) long ใชเกบคาตวเลขจ านวนเตม 64 –9,223,372,036,854,775,808 (263) ถง
9,223,372,036,854,775,807 (263 – 1) float ใชเกบคาตวเลขทศนยม 32 พสยดานลบ: -3.40282346638528860e+38 ถง
-1.40129846432481707e-45 พสยดานบวก: 1.40129846432481707e-45 ถง 3.40282346638528860e+38
double ใชเกบคาตวเลขทศนยม 64 พสยดานลบ: -1.79769313486231570e+308 ถง -4.94065645841246544e-324 พสยดานบวก: 4.94065645841246544e-324 ถง 1.79769313486231570e+308
char ใชเกบคาตวอกขระหนงตว 16 0 – 65,535
การประกาศตวแปร (Variable Declaration)
การประกาศตวแปร คอ การบอกให compiler รวา ผเขยนโปรแกรมตองการจองพนทหนวยความจ าไว
ใชงาน และ ให compiler รวา ขอมลทจะน ามาใสเปนชนดใด ไวยากรณ (syntax) ส าหรบการประกาศตวแปร
สามารถเขยนไดดงน:-
[<variable_modifier>] [scope_modifier] <variable_type> <variable_name> [=initial_value];
ใน syntax ขางตน สวนทอยใน < > เปนสวนทจ าเปนส าหรบการประกาศตวแปร ถาไมม การประกาศตวแปรจะไมเกดขน ในทน การประกาศตวแปรตองการแค variable type และ ชอตวแปร ดงตวอยางตอไปน:-
int x; // ประกาศตวแปร x ชนด int (integer) ใชเกบคาจ านวนเตม double radius; // ประกาศตวแปร radius ชนด double ใชเกบคาทศนยม char a; // ประกาศตวแปร a ชนด char (character) ใชเกบคาอกขระ
สวนทม [ ] ครอบอย บางครงไมมกได แตบางครงมนกมความส าคญส าหรบการเขยนโปรแกรม ในทนจะ
กลาวถงคราว ๆ เทานน
- variable modifier ใชระบถงรายละเอยดการเขาถงตวแปร ประกอบดวย
o public: ท าใหทก object สามารถเขาถงตวแปรได
o protected: ท าให object สามารถเขาถงตวแปรไดเฉพาะภายในคลาสและ sub class ท
สบทอดกนมา
o private: ท าให object สามารถเขาถงตวแปรไดเฉพาะภายในคลาสเทานน ไมรวม sub
class
- scope modifier ม 2 ชนด ไดแก
o static: class ทมการประกาศตวแปรแบบ static จะมค าวา static ขณะประกาศตวแปร
โดย object ของ class นทกตวจะใชตวแปรนรวมกน ถา object ตวใดเปลยนคาในตวแปร
น object ตวอนกจะเหนคาทถกเปลยนในตวแปรนดวย ในกรณทผพฒนาโปรแกรมไมระบ
ค าวา static ตวแปรจะเปนแบบ non-static (หรอเรยกอกแบบวา instance) แตละ
object ของ class นจะมตวแปรชอนเปนของตวเอง การเปลยนคาในตวแปรของ object
ตวใด จะไมสงผลตอคาในตวแปรชอเดยวกนนของ object อน ๆ
o final: เปนตวแปรทเกบคาคงท เมอตงคาแลวจะไมสามารถเปลยนคาได เชน เมอประกาศตว
แปรดงน final double PI = 3.14159; ตวแปร PI จะเกบคาคงทและไมสามารถถก
เปลยนแปลงไดอก
- initial value เปนคาตงตนทจะตงใหกบตวแปรนนหลงจากการประกาศเสรจแลว
ตวอยางการประกาศตวแปรพรอมทงการใสคาตงตนอยางงาย
double d_var = 10.0;
เปนการจองหนวยความจ า 8 bytes (64 บต) เพอใชเกบคาเลขทศนยม โดยเมอประกาศตวแปรน (หรอ
จองหนวยความจ า) เสรจแลว จะตงคาในหนวยความจ าใหเทากบ 10.0
การตงชอตวแปร 1. ชอตวแปรเรมตนดวยตวอกษรเสมอ เรมตนดวยตวเลข หรอ $ ไมได 2. ชอตวแปรสามารถประกอบดวยตวอกษร ตวเลข เครองหมาย $ หรอ _ 3. ชอตวแปรหามมชองวาง และตวพมพเลกพมพใหญจะตางกน 4. เพอใหเปนมาตรฐานเดยวกนและเขาใจความหมายของชอตวแปรไดงาย ชอจะเรมตนดวยตวพมพเลก ถาชอประกอบดวยค าหลายค าเมอขนค าใหมอกษรตวแรกของค าจะใชตวพมพใหญ ตวตอมาจะเปนตวพมพเลก เวนแตกรณทเปนคาคงท (final) จะใชตวพมพใหญทงหมดแลวคนระหวางค าดวย _ เชน int studentID; หรอ final int SIZE = 3; 5. หามใช true, false หรอ null 6. หามใชค าสงวน (reserved words) อนไดแก:-
abstract continue for new switch
assert default goto package synchronized
boolean do if private this
break double implements protected throw
byte else import public throws
case enum instanceof return transient
catch extends int short try
char final interface static void
class finally long strictfp volatile
const float native super while
การตงคาขอมลใหตวแปร เมอประกาศตวแปรแลว เราอาจใสคาเรมตน (initialize) ใหตวแปรไดเลย ดงทไดอธบายขางตน หรอ ถาตองการเปลยนแปลงคาภายในตวแปรภายหลง กสามารถท าไดโดยใช เครองหมายด าเนนการ = (operator ก าหนดคา) ตวอยางเชน เมอเราประกาศตวแปร radius, x และ a แลว เราสามารถก าหนดคาในตวแปรเหลานไดอก ดงตวอยาง:-
radius = 210.0; // น าคา 210.0 ไปใสไวในหนวยความจ าส าหรบตวแปรชอ radius // (หนวยความจ าท 102 ในรปดานลาง)
x = 1; // น าคา 1 ไปใสไวในหนวยความจ าส าหรบ x // (หนวยความจ าท 103 ในรปดานลาง)
a = 'A'; // แปลงอกขระ A เปนรหสตวเลข ASCII (65) แลว, น าไปใสไวใน // หนวยความจ าท 104 ส าหรบตวแปรชอ a
ขอควรระวง 1 เราจะตงคาขอมลใหตวแปรใด ๆ ไดกตอเมอ เราไดประกาศตวแปรนน ๆ แลว !!!!
ขอควรระวง 2 การใชตวด าเนนการ = เปนการบอกให Java น าคาทอยทางขวามอของเครองหมาย = ไป
ใสไวในตวแปร (หนวยความจ า) ดานซายมอของเครองหมาย = ดงนน Java จะแจง error ถาเราใชค าสง 1 = x;
เนองจาก 1 ไมใชตวแปรทจะมารบคาในตวแปร x
ขอควรระวง 3 ดงไดอธบายแลวในเรองชนดของขอมลพนฐาน ตวแปรทกตวจะสามารถเกบคาทอยในชวง
ทถกตองเทานน เนองจากเนอหนวยความจ าของแตละตวแปรนนมขนาดจ ากด นกเขยนโปรแกรมตองพงระวงเรอง
ขนาดของตวแปรใหด เพอปองกนการเกด bug ทสามารถเกดไดงาย ๆ
ขอควรระวง 4 การตงคาใหตวแปรมขอควรระวงอกขอคอ ชนดของคาเรมตนจะตองเปนชนดเดยวกนกบ
ตวแปรนน หรอ ชนดของคานนตองเปนชนดทสามารถถกเปลยน (cast) ใหเปนชนดเดยวกบชนดของตวแปรได
(รายละเอยดเกยวกบ casting จะกลาวภายหลง) เชน int my_int_var = 10.0; ไมถกตอง เพราะ my_int_var
เปนชนด int แต 10.0 เปนชนด double compiler จะแจงวามความผดพลาดขน
*ด ร า ย ล ะ เ อ ย ด เ พ ม เ ต ม เ ก ย ว ก บ ก า ร จ ด เ ก บ จ า น วน เ ต ม ร ว ม ท ง ค ว า ม ร พ น ฐ า น เ ล ข ฐ า น ส อ ง ไ ด ท
www.informatics.buu.ac.th/~jira/886200/Lecture3.pdf
สญพจน (literal)
สญพจน (literal) เปนสวนหนงของ source code ทมคาตามตวอกษร (Java ไมตองค านวณหรออานมา
จากหนวยความจ า) สญพจนตางจากตวแปรตรงท compiler ตองตความคาของตวแปรกอนการด าเนนการ
ตวอยางของ literal เชน true, 'C' หรอคาตวเลขตาง ๆ เชน 100, 10000, หรอ 5.0 ซง literal นสามารถกน ามา
ก าหนดคาใหกบตวแปรตาง ๆ ไดดงตวอยางดานลาง:
210.0
1
65
boolean result = true;
char capitalC = 'C';
byte b = 100;
short x = 10000;
double d = 5.0;
สญพจนในตวอยางขางตนมหลายชนดไดแก:- - สญพจนชนดตรรกะแบบบล (Boolean literal) คอ คาทางตรรกะ true หรอ false - สญพจนชนดตวอกขระ (Character liter) คอ คาทเปนตวอกขระหนงตว โดยใชเครองหมาย ' '
ก ากบ เชน สญพจนตวอกขระ C จะตองถกเขยนเปน 'C' - สญพจนชนดตวเลข (Number Literals) คอคาคงททปรากฏใน source code เชน 100, 10000 ท
อยในตวอยางขางตนเปน integer literal (สญพจนทเปนจ านวนเตม) สวน 5.0 เปน floating-point literal (สญพจนทเปนจ านวนทศนยม)
ขอควรระวง 1 เมอเราใช System.out.println( x ); เนองจาก x เปนตวแปรไมใชสญพจน Java จะน าคาทเกบไวใน x ออกมาแสดงผลทางหนาจอ หากเราตองการระบให Java แสดงตวอกษร x ออกทางหนาจอ เราตองใชค าสงตอไปนแทน System.out.println( "x" ); หรอ System.out.println( 'x' );
นนคอ ถาเราพมพตวเลข, true, false, ตวอกษรตวเดยวม ' ' ก ากบ, หรอ สายอกขระม " " ก ากบ Java จะมองวาเปนสญพจน (และจะตความตามตวอกษร) แต ถาเราพมพตวอกษรหรอสายอกขระทไมม ' ' หรอ " " ก ากบ Java จะมองวา เราหมายถงตวแปรและจะตองน าคาในตวแปรออกมากอนประมวลผลตอไป
ขอควรระวง 2 ถาเราพยายามตงคา literal ทมากเกนกวาทตวแปรจะเกบได เราจะไดรบ error ตอน
compile เชนตวอยางตอไปน byte b = 1000;
Java จะใหสญพจนทเปนจ านวนเตม (integer literal) ทกตวเปนชนด int โดยอตโนมต ไมใชชนด byte,
short หรอ long ถาเราอยากใหสญพจนทเปนจ านวนเตมเปนชนด long ใหเตม L หรอ l ตอทายสญพจนนน
(ขอแนะน า: ใช L ดกวาเพราะ l คลาย I และ 1 เกนไป)
Java จะใหสญพจนทเปนจ านวนทศนยม (floating-point literal) ทกตวเปนชนด double โดยอตโนมต
ไมใชชนด float ถาเราอยากใหสญพจนทเปนจ านวนทศนยมเปนชนด float ใหเตม F หรอ f ตอทายสญพจนนน
เชน Java จะตความวาสญพจน 5.0 เปนชนด double ถาเราจะท าให Java ตความวาเปน float ใหเตม f หรอ F
ตอทาย ดงน 5.0f หรอ 5.0F (ในท านองเดยวกน เราใช d หรอ D ตอทายสญพจนเพอให Java ตความสญพจนให
เปนชนด double ดงน 100.2d หรอ 100.2D)
สญพจนทเปนจ านวนทศนยม (floating-point literal) สามารถถกเขยนไดแบบวทยาศาสตร เชน
1.23456e+2 หรอ 1.23456e2 ซงหมายถง 123.456 และ 1.23456e-2 ซงหมายถง 0.0123456 (จะใช e หรอ E
กได)
ตวด าเนนการ หรอ เครองหมายด าเนนการ (operator)
ตวด าเนนการอาจถกแบงไดเปนหลายประเภท ดงน:-
1. ตวด าเนนการตวเลข (Numeric Operators)
ชอ ความหมาย ตวอยาง ผลลพธ + การบวก 34 + 1 35 - การลบ 34.0 – 0.1 33.9 * การคณ 300 * 30 9000 / การหาร 1.0 / 2.0 0.5 % การหารหาเศษ 20 % 3 2
ในตวอยางการค านวณเลขขางตน แตละตวอยางมการใชตวถกด าเนนการ (operand) 2 ตว เชน 34
+1 (+ เปน ตวด าเนนการ (operator), 34 และ 1 คอ ตวถกด าเนนการ (operand)) เราเรยก operator ทม 2
operands แบบนวา Binary operator โดยชนดของ operands ทงสองจะเปน byte, short, int, long, float
หรอ double กได
บางครง operator + และ – ถกใชกบ operand แคตวเดยวได (เรยกวา Unary Plus และ Unary
Minus) เชน –a จะใหคาตดลบของคาทอยในตวแปร a
ขอควรระวง ชนดของผลลพธของการด าเนนการตวเลขจะเปนชนดเดยวกบชนดของ operand ทใช
หนวยความจ าใหญกวา ตวอยางเชน
- 5 / 2 จะใหผลลพธเปน 2 ไมใช 2.5 เนองจาก operand 5 และ 2 ตางกเปน literal ทเปน integer
ดงนนชนดของผลลพธทไดจะเปน 2 ซงเปน integer แทนทจะเปน 2.5 ซงเปน double
- 5.0 / 2 จะใหผลลพธเปน 2.5 เนองจาก operand 5.0 เปน literal ชนด double แม 2 จะเปน
literal ชนด int ชนดของผลลพธทไดจะเปน double ดวย (สงเกตวา double ใชหนวยความจ า
มากกวา integer)
การหารหาเศษโดยการใช % (Remainder Operator, สวนใหญอานวา mod) ถกพบบอยมากในการ
เขยนโปรแกรม เชน
- ในกรณการตรวจสอบวาตวเลขเปนเลขค (หาร 2 ลงตว) หรอไม เรามกจะน าตวเลขนนมาหารแบบหา
เศษ (mod) ถาไดผลลพธเปน 0 แสดงวาเลขนนเปนเลขค
- สมมตวา วนนเปนวนเสารแลวเราอยากรวาอก 10 วนเปนวนอะไร เราสามารถหาไดโดยใชนพจน
ดานลางน: (6 + 10) % 7 ได 2 โดยวนเสารถกแทนดวย 6 สปดาหหนงมแค 7 วน ดงนนหลงจากวน
เสารไป 10 วน คอ 2 (ซงใชแทนวนองคาร)
- ในกรณทเราตองการแยกตวเลขแตละหลกออกมา เราสามารถท าไดโดยการใช % และ / สลบกน
เชน ถาเรารบ 1234 มา แลวเราอยากแยกมนออกมาเปน 1, 2, 3, และ 4 เพอด าเนนการตอ เราท า
ไดดงน:-
--> 1234 % 10 ไดผลลพธ 4
--> 1234 / 10 ไดผลลพธ 123
--> 123 % 10 ไดผลลพธ 3
--> 123 / 10 ไดผลลพธ 12
--> 12 % 10 ไดผลลพธ 2
--> 12 / 10 ไดผลลพธ 1
--> 1 % 10 ไดผลลพธ 1
2. ตวด าเนนการเพอการตงคา (Assignment Operators)
การตงคาใหกบตวแปรสามารถท าไดโดยใชเครองหมาย = ซงคาทอยทางขวามอของ = จะถก
น ามาก าหนดใหกบตวแปรทางซายมอ และ ถาค าสงในการก าหนดคาเปนการน าตวแปรทอยทาง
ซายมอมาด าเนนการรวมดวย เราสามารถเขยนในรปยอได ดงตออยางตอไปน
ตวด าเนนการ ตวอยางอยางยอ ตวอยางแบบเตม = i = 8 i = 8 += i += 8 i = i + 8 -= i -= 8 i = i - 8 *= i *= 8 i = i * 8 /= i /= 8 i = i / 8 %= i %= 8 i = i % 8
3. ตวด าเนนการเพมและลด (Increment and Decrement Operators) มการใชงานมากในโครงสราง
ควบคมการท างานชนดท าซ า
ตวด าเนนการ ชอ ++ (var) prefix increment -- (var) prefix decrement (var) ++ postfix increment (var)-- postfix decrement
increment ++ เพมคาของตวแปรขน 1 decrement -- ลดคาของตวแปรลง 1 operator
ทงสองนมการใชงาน 2 รปแบบ คอใชหนาตวแปร (prefix) และใชหลงตวแปร (postfix) ซงมความหมายตางกน
ขอใหศกษาการใชงานจากตวอยางตอไปน
o แบบ prefix ปรบคาของตวแปรกอน แลวจงน าคาของตวแปรนนไปใช int a = 9, b;
b = ++a;
เปนการเพมคาของตวแปร a ขนอก 1 ดงนนคาของตวแปร a จงเปลยนเปน 10 จากนนจง
คาของตวแปร a ไปก าหนดใหแกตวแปร b ดงนนตวแปร b จงมคาเปน 10 สรปวาเมอ
ท างานเสรจคาของตวแปร a = 10 และตวแปร b = 10
o แบบ postfix น าคาของตวแปรนนไปใชกอน แลวจงปรบคาของตวแปร
int a = 9, b;
b = a++;
เปนการน าคาปจจบนของตวแปร a ไปก าหนดใหแกตวแปร b เนองคาปจบนของตวแปร a มคาเปน
9 ดงนนตวแปร b จงมคาเปน 9 ดวย จากนนจงท าการเพมคาของตวแปร a ขนอก 1 ท าใหตวแปร
a มคาเปน 10 สรปวาเมอท างานเสรจคาของตวแปร a = 10 และตวแปร b = 9
4. ตวด าเนนการเกยวกบการเปรยบเทยบ (Comparison Operators) หลงจากการเปรยบเทยบแลว จะ
ใหผลลพธเปน true หรอ false (รายละเอยดจะกลาวถงภายหลง)
ตวด าเนนการ ชอ < นอยกวา <= นอยกวาหรอเทากบ > มากกวา >= มากกวาหรอเทากบ == เทากบ != ไมเทากบ
5. ตวด าเนนการเกยวกบตรรกะแบบบล (Boolean Operators) หลงจากการด าเนนการแลว จะให
ผลลพธเปน true หรอ false (รายละเอยดจะกลาวถงภายหลง)
ตวด าเนนการ ชอ ! not
&& logical and || logical or ^ exclusive or
นพจน (expression)
เรารจก ตวแปร และ ตวด าเนนการ (operators) กนแลว ตอมาเราจะมาเรยนเกยวกบเรองนพจน
(expression) รวมทง เพมความเขาใจเกยวกบ statement กบ block ใหมากขน
โครงสรางของ expression ประกอบดวย ตวแปร, operator, และ การเรยก method ซงจะเปนไปตาม
ไวยากรณ (syntax) ของภาษาจาวา
expression ทเขยนถกไวยกรณจะถก Java ตความออกมาเปนคาคาหนง โดยทคานอาจเปนชนดใดกได
(boolean, char, int, … ฯลฯ) ขนกบ expression นน เชน 1 * 2 * 3 จะถก Java ค านวณและตคาเปน 6 ซง
เปนชนด int
ขอควรระวง ล าดบการเขยนของ ตวแปร, operator และ method มความส าคญ ถาท าไมชดเจน เรา
อาจไดผลลพธทไมตองการได เชน expression 2 + 6 / 4 นนไมชดเจนวา เราอยากจะให Java บวกหรอหารกอน
เราสามารถใช () ระบใหชดเจนวาจะให Java ท าสวนไหนกอน เชน (2 + 6) / 4 เปนการระบให Java ท า
การด าเนนการบวกกอน และ 2 + (6 / 4) เปนการระบให Java ท าการด าเนนการหารกอน
ล าดบความส าคญ (Precedence Order)
ถาผเขยนโปรแกรมไมไดระบล าดบการด าเนนการใน expression โดยใช ( ) แลว Java จะไมแจง error
แตจะด าเนนการตามกฎการท ากอน (Precedence, เปนล าดบการด าเนนการกอนหลง คลายกบล าดบการ
ด าเนนการทางคณตศาสตร) ดงน:-
1) นพจนทอยในวงเลบในสดจะถกตคากอน
2) การตคาจะตองเลอกท าตวด าเนนการตามล าดบทแสดงในตารางดานลาง โดย operator ทอยใน
ล าดบบนของตารางจะถกด าเนนการกอน operator ทอยล าดบต ากวา
3) ในกรณท expression หนงม operator ล าดบเดยวกนหลายตว Java จะเลอกท าจาก operator ตว
ซายสดกอน เชน a – b + c – d จะถกด าเนนการเหมอน ((a – b) + c) – d โดยการด าเนนการตอง
ค านงถง Associativity ดวยวาจะท าจากซายไปขวา หรอ ขาวไปซาย
Operator Precedence
Operators Expression Precedence Associativity
วงเลบ, ดชนของ array, การเลอกสมาชก
( ) [ ] . Highest ซายไปขวา
postfix var++ var-- ขวาไปซาย
prefix, unary plus/minus, นเสธ, คอมพลเมนตบต, การ cast ชนด
++var --var +expr -expr ~var !var (type) expr
ขวาไปซาย
การคณ การหาร * / % ซายไปขวา
การบวก การลบ + - ซายไปขวา
การเลอนบต << >> >>> ซายไปขวา
ความสมพนธ < > <= >= instanceof ซายไปขวา
การตรวจสอบความเทากน == != ซายไปขวา
bitwise AND & ซายไปขวา
bitwise exclusive OR ^ ซายไปขวา
bitwise inclusive OR | ซายไปขวา
logical AND && ซายไปขวา
logical OR || ซายไปขวา
Ternary ? : ขวาไปซาย
การก าหนดคา = += -= *= /= %= &= ^= |= <<= >>= >>>=
Lowest ขวาไปซาย
ตวอยางการค านวณตามล าดบ precedence
ความแตกตางระหวาง Statement กบ Expression
เราไดรความหมายของ statement ไปแลวในบททแลว นนคอ statement จะถกใชแทน action หรอ
การกระท า ทผเขยนตงใจจะใหโปรแกรมท า (execute) ซงทก ๆ statement จะจบลงดวยเครองหมาย ; แตเรา
จะมาเรยนรรายละเอยดเพมอกนดเพอจะไดทราบความแตกตางระหวาง statement กบ expression
เราสามารถกลาวไดวา statement เหมอนประโยคทว ๆ ไปในภาษาพด แตในภาษา Java แลว
statement จะถกเขยนแทนการกระท าการทางคอมพวเตอรทสมบรณ (complete execution) แบงเปนรปแบบ
ตาง ๆ ดงน
1. expression statement: บางครง statement กประกอบไปดวย expression แลวตามดวย ;
เทานน เชน
o aVar = 89; // ซงกคอ assignment expression ตามดวย ;
o aVar++; // ซงกคอ increment expression ตามดวย ;
o System.out.println(“Hello”); // ซงกคอ การเรยก method ตามดวย ;
o Bicycle myBike = new Bicycle(); // ซงกคอ การสราง object ตามดวย ; (รายละเอยด
จะอธบายภายหลง)
2. declaration statement: เชน int aVar; หรอ int aVar = 89;
3. control flow statement: เปน statement ทควบคมล าดบการท างานของโปรแกรม โดยใชค าสง
ทางเลอก (if, if-else, switch) หรอ สงใหโปรแกรมท างานแบบท าซ า (loop for, while, do-while)
หรอ สงใหหยดท างานและไปท างานอกทหนง (break, continue, return)
Blocks เปนกลมของ statement ตงแต 0 statement ขนไปทอยระหวาง { } ซงเราสามารถใช block
ไดทก ๆ แหงท Java ยอมใหใส statement เราสราง Block เพอก าหนดขอบเขต (scope) ของการใชงานตวแปร
และ/หรอ ก าหนดขอบเขตของการใชค าสงตาง ๆ ทอยภายใตค าสงทางเลอก หรอภายใตค าสงท าซ า
ตวอยางของ block
class BlockDemo { <---------------------- begin block class
public static void main(String[] args) { <---------------------- begin block method
boolean condition = true;
if (condition) { <---------------------- begin block 1
System.out.println("Condition is true.");
} <---------------------- end block 1
else { <---------------------- begin block 2
System.out.println("Condition is false.");
} <---------------------- end block 2
} <---------------------- end block method
} <---------------------- end block class
การแปลงชนดตวเลข (Numeric Type Conversion)
เมอเราใชตวด าเนนการแบบ binary (มตวถกด าเนนการ 2 ตว เชน x + y, a * b) แตตวถกด าเนนการทง 2 มชนดตางกน, Java จะแปลงชนดของตวถกด าเนนการโดยอตโนมต (การแปลงชนดของขอมลน ผเขยนโปรแกรมไมตองแปลงเองเรยกวา implicit casting) ตามกฎการแปลง (Conversion Rules) ตอไปน:
1. ถาตวถกด าเนนการตวใดตวหนงเปนชนด double, อกตวกจะถกแปลงเปน double 2. ถาไมใชขอขางตน, ถาตวถกด าเนนการตวใดตวหนงเปนชนด float, อกตวกจะถกแปลงเปน float 3. ถาไมใชขอขางตน, ถาตวถกด าเนนการตวใดตวหนงเปนชนด long, อกตวกจะถกแปลงเปน long 4. ถาไมใชขอขางตน, ตวถกด าเนนการทงสองจะถกแปลงเปน int
พจารณาตวอยาง statement ตอไปน:
byte i = 100; long k = i * 3 + 4; double d = i * 3.1 + k / 2; ตามทไดกลาวมาแลว Java มองสญพจนทเปนตวเลขจ านวนเตมทกตวเปนชนด int ดงนน 100 จะถกมองวาเปนชนด int กอนถกน าไปก าหนดคาให i, แต i เปนตวแปรชนด byte ดงนนกอนท Java จะน าคา 100 ไปใสในตวแปร i ได Java ตองท าการแปลงชนดของตวเลข 100 นใหเปน byte กอน ในบรรทดทสอง Java จะท าการค านวณคาทางขวามอของ = ใหเสรจกอนการก าหนดคาใหตวแปร k ทอยดานซายมอของเครองหมาย = โดยการค านวณคาดงกลาว Java จะตองแปลงชนดของคาในตวแปร i จาก byte เปน int กอน จงสามารถน ามาคณกบสญพจนตวเลข 3 (ชนด int) ได ผลลพธจากการคณคอ 300 (ชนด int) จากนน Java ท าการบวก 300 ดวย 4 ไดผลลพธ 304 (ชนด int) ล าดบสดทาย Java ตองท าการเปลยนชนด int ของ 304 ใหเปนชนด long กอนจงคอยน า 304 ไปก าหนดคาให k (ชนด long) ในบรรทดทสาม Java ท าขนตอนดงน 1) เปลยนชนดของคาในตวแปร i จาก byte ใหเปน double แลวน าไปคณกบ 3.1 (ชนด double) ไดผลลพธเปน 310.0 (ชนด double) 2) เปลยนชนดของตวเลข 2 จาก int เปน long แลวน า 2 ไปหาร k ไดผลลพธเปน 152 (ชนด long) 3) เปลยนชนดของ 152 จาก long เปน double กอนทจะน าไปบวกกบ 310.0 ไดผลลพธการบวกเปน 462.0 (ชนด double) 4) ก าหนดคา 462.0 (ชนด double) ใหตวแปร d
การแปลงชนดของขอมลชนดตาง ๆ (Type Casting) นอกจากการแปลงชนดขอมลทเปนตวเลขแลว Java ยงยอมใหมการแปลงชนดขอมลชนดตาง ๆ อก โดยการแปลงชนดขอมลใน Java มสองแบบ
1. การแปลงโดยปรยาย (Implicit casting) ในการแปลงชนดน โปรแกรมไมตองสงใน Java ท าการแปลง เพราะ Java ฉลาดพอทจะแปลงชนดของขอมลใหอตโนมต เชน
double d = 3; // Java จะแปลงชนด int ของ 3 ใหกลายเปนชนด double อตโนมต 2. การแปลงโดยโปรแกรมเมอรตงใจ (Explicit casting) บางครง การแปลงชนดขอมลอาจท าใหเสย
ความแมนย าได Java จงไมท าการแปลงชนดของขอมลใหอตโนมต โปรแกรมเมอรตองระบถงการแปลงชนดขอมลใหชดเจน เชน
int i = 3.1; // Java จะแจง error เนองจาก Java ไมแปลง 3.1 (ชนด double) ให // เปน 3 (ชนด int) ใหโดยอตโนมต เพราะ การแปลงคาท าใหสญเสย // ความแมนย าของขอมล
ถาโปรแกรมตองการระบให Java แปลงชนดขอมลในค าสงขางตน โปรแกรมเมอรตองพมพ (int) น าหนาขอมลทอยากจะให Java แปลงชนดขอมลให ดงน int i = (int) 3.1; // โปรแกรมเมอรระบให Java แปลง 3.1 ใหเปน 3 โดยท Java จะ // แปลงชนดของขอมลใหโดยไมฟอง error เนองจาก โปรแกรมเมอร // ระบบอก Java อยางชดแจง ดวยค าสงการ cast (int) ชนดขอมลตวอกขระ (Character Data Type) หนวยความจ าสามารถเกบขอมลเปนตวเลขฐานสองเทานน ดงนน หาก Java ตองการเกบขอมลทเปนตวอกขระ เชน อกษร A-Z Java จะตองท าการเขารหสอกษรเหลานนใหเปนตวเลขกอน ซงการเขารหสท Java ใชมสองรปแบบ คอ รปแบบของรหส ASCII และ รปแบบมาตรฐาน Unicode ตวอยางดานลางแสดงการประกาศและก าหนดคาตวแปรชนดอกขระ
char letter1 = 'A'; char numChar1 = '5'; char letter2 = '\u0041'; char numChar2 = '\u0034';
การประกาศตวแปร 4 ตวขางตน เปนการประกาศตวแปร (หรอจองหนวยความจ า) เพอใชเกบขอมลชนดตวอกษร (ชนด char) การก าหนดคาใหตวแปร letter1 และ numChar1 เปนการก าหนดคาในรปแบบรหส ASCII ผเขยนโปรแกรมตองใสตวอกษรในสญลกษณ ' ' (สญลกษณฝนทอง, หรอ single quote) เพอระบตวอกษรทจะ
น ามาก าหนดคาใหตวแปรในตวอยางขางตน ตวแปร letter1 เกบคาตวเลขทใชแทนอกษร A สวนตวแปร numChar1 เกบคาตวเลขทใชแทนอกษร 5 (ขอสงเกต: numChar1 ไมไดเกบคาเลข 5 แตเกบคาตวเลขทใชแทนอกษร 5)
สวนการก าหนดคาใหตวแปร letter2 และ numChar2 เปนการก าหนดคาในรปแบบ Unicode ผเขยนโปรแกรมตองใสตวเลขรหสมาตรฐานเปนตวเลขฐานสบหก (คา 0000 ถง FFFF) ตามหลง \u ในสญลกษณ ' ' เพอระบตวอกษรทจะน ามาก าหนดคาใหตวแปรในตวอยางขางตน ตวแปร letter2 เกบคาตวเลขรหส Unicode \u0041 ทใชแทนอกษร A สวนตวแปร numChar2 เกบคาตวเลขรหส Unicode ทใชแทนอกษร 5 (ขอสงเกต: numChar2 ไมไดเกบคาเลข 5 แตเกบคาตวเลขรหส Unicode \u0034 ทใชแทนอกษร 5)
จรง ๆ แลวรหส ASCII เปนชดรหสทเปน subset ของรหส Unicode โดยรหส ASCII มคาตงแต 0 ถง 128 หรอ คาตงแต \u0000 ถง \u007f ในรหส Unicode (สาเหตท Java ใชชดรหส Unicode เพราะ Unicode สามารถครอบคลมรหสของตวอกษรภาษาตาง ๆ และ สญลกษณตาง ๆ ไดมากกวา ASCII มาก) ตารางดานลางแสดงสญลกษณและตวอกขระในรหส ASCII ในรปแบบเลขฐานสบ
กอนทจะขนเรองขอมลสายอกขระ เรามาดเรองการเปลยนชนดของตวแปรอกครง ดงไดอธบายกอนหนานวา Java จ าเปนตองเปลยนตวอกษรใหเปนรหสตวเลขกอนทจะก าหนดคาใหตวแปรชนด char ได เชนในการด าเนนการค าสง char letter1 = 'A'; Java ตองเปลยนอกขระ A ใหเปนเลข 65 (เทากบ /u0041 ในเลขฐานสบหก) กอนทจะก าหนดคาใหตวแปร letter1 ขนตอนทวานกเปน Implicit casting คอ การเปลยนชนดของ literal ทเปนชนดตวอกษร (char) ใหเปนชนดเลขจ านวนเตม (int) โดยท Java ท าใหอตโนมต ซงการท า Implicit casting โดย Java นใหผลลพธเชนเดยวกบเมอโปรแกรมเมอรใช statement ตอไปน:- char letter1 = 65; หรอ char letter1 = (char) 65; ในท านองเดยวกน Java จะท า Implicit casting จาก char มาเปน integer ใหอตโนมต นนคอ Java จะไมแจง error ส าหรบ statement น int i = 'A'; ซงเหมอนกบ statement int i = (int) 'A';
ชนดขอมลสายอกขระ (String Type) ตวแปรชนด char เกบขอมลไดแคหนงตวอกขระ ถาเราจะเกบขอมลทเปนสายอกขระเราตองใชตวแปรชนด String เชน String message = "Welcome to Java"; ขอสงเกต 1: ขอมลสายอกขระตองอยในเครองหมาย " " (ฟนหน หรอ double quote) ในขณะท ขอมลอกขระเดยวตองอยในเครองหมาย ' ' (ฝนทอง หรอ single quote)
ขอสงเกต 2: บางครงสายอกขระอาจมตวอกษรเดยว เราอาจเหน expression ลกษณะน "A" ซงไมไดผดอะไร โดย แทนท "A" จะหมายถงชอมลอกขระ A (ชนด char) แตหมายถงขอมลสายอกขระทมอกษร A ตวเดยว (ชนด string) Java อ านวยความสะดวกใหโปรแกรมเมอรในกรณท โปรแกรมเมอรอยากน าสายอกขระมาตอกน (Concatenate) โดยใหใช operator + เปนตวเชอม เชน statement ตอไปน:- String message = "Chapter " + 2; เมอ Java พบ operator + ถกใชกบตวถกด าเนนการสองชนด (โดยหนงในนนเปนชนด string) Java จะฉลาดพอ และ ตความโดยอตโนมตวา โปรแกรมเมอรตองการตอสายอกขระ Chapter กบ เลข 2 ใหกลายเปน "Chapter 2" ดงนน แทนท Java จะน าคา Chapter ไปบวก 2 Java จะท า Implicit casting เปลยนชนดของ 2 (ชนด int) ใหเปนชนด String "2" จากนนจะท าการตอสายอกขระทงสอง
เกรดความร: Java มค าสง Integer.parseInt() และ Double.parseDouble() ชวยแปลง string ใหเปน integer และ double ตามล าดบ ตวอยางการใชมดงน:-
int intValue = Integer.parseInt(“123”); double doubleValue =Double.parseDouble(“123.45”);
ตวอยางโปรแกรมค านวณอยางงาย
01: public class ComputeArea {
02: /** Main method */
03: public static void main(String[] args) {
04: double radius;
05: double area;
06: // Assign a radius
07: radius = 2.0;
08: // Compute area
09: area = radius * radius * 3.14159;
10: // Display results
11: System.out.println("The area for the circle of radius " +
12: radius + " is " + area);
13: }
14: }
บรรทดท 2, 6, 8, 10: เปน comment ไมไดถกใชในการ compile และไมเกยวกบการท างานของโปรแกรม ถกเขยนเพอ
อธบาย source code เทานน มความส าคญเมอผเขยนโปรแกรมตองการท าความเขาใจโปรแกรมภายหลง
1: เปนการประกาศ class ชอ ComputeArea (เครองหมาย { แสดงวา block ของ class ComputeArea เรมทน)
3: เปนการประกาศ method ชอ main ซงม argument เปน array ของ String ซงรายละเอยดของ argument นจะกลาวภายหลง(เครองหมาย { แสดงวา block ของ method main เรมทน)
4, 5: เปนการประการศตวแปรชนด double เพอเกบขอมลเลขทศนยม 2 ตวชอ radius และ area
7: เปน statement การตงคา (assignment statement) CPU จะกระท าการตงคาให ตวแปร radius กลาวโดยละเอยดคอ compiler จะเปลยน 20 ซงเปนเลขจ านวนเตมใหเปน 20.0 (ชนด double ซงเปนชนดเดยวกบตว operand ดานซายมอของ operator =)
9: เปน assignment statement ทม expression อยดานขวามอของ operator = ซงตามล าดบ precedence ล าดบการท าการ statement นมดงน 9.1 compiler จะเลอกท า * ทงสองกอน = โดยจะท าจากซายไปขวา ได 4.0 * 3.14159 9.2 compiler ท า * ทเหลอ ได 12.56636 9.3 compiler ท า = นนคอ ท าการตงคา 12.56636 ใหตวแปรชอ area (พดอกอยางวา น าคา
12.56636 ไปใสในหนวยความจ าทถกตงชอวา area) 11: พมพคาทอยในวงเลบออกหนาจอ 13: เครองหมาย } เปนการบอก compiler วา block ของ method main ไดสนสดทต าแหนงน 14: เครองหมาย } เปนการบอก compiler วา block ของ class ComputeArea ไดสนสดทต าแหนงน การรบ input จาก keyboard โดยใช Scanner ใน Java เราสามารถรบขอมลจากแปนพมพเพอน ามาประมวลผลตอไปโดยมล าดบขนตอนตอไปน:-
1. สราง object Scanner ดงตวอยาง Scanner scanner = new Scanner(System.in);
2. เรยกใช methods next(), nextByte(), nextShort(), nextInt(), nextLong(), nextFloat(), nextDouble(), or nextBoolean() เพอรบคา string, byte, short, int, long, float, double, หรอ boolean ตามล าดบ เชน
System.out.print("Enter a double value: "); double d = scanner.nextDouble(); // scanner คอ object ทเราสรางขนในขนตอนท 1