20
ชนิดข้อมูลพื้นฐาน และ การดาเนินการที่เกี่ยวข้องกับตัวแปร (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) ของตัวแปรมีดังนี:-

ชนิดข้อมูลพื้นฐาน และ การด าเนินการที่เกี่ยวข้องกับตัวแปร ...nutthanon/886201/Lect02.pdf ·

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

Page 1: ชนิดข้อมูลพื้นฐาน และ การด าเนินการที่เกี่ยวข้องกับตัวแปร ...nutthanon/886201/Lect02.pdf ·

ชนดขอมลพนฐาน และ การด าเนนการทเกยวของกบตวแปร (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) ของตวแปรมดงน:-

Page 2: ชนิดข้อมูลพื้นฐาน และ การด าเนินการที่เกี่ยวข้องกับตัวแปร ...nutthanon/886201/Lect02.pdf ·

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) ใชเกบคาอกขระ

Page 3: ชนิดข้อมูลพื้นฐาน และ การด าเนินการที่เกี่ยวข้องกับตัวแปร ...nutthanon/886201/Lect02.pdf ·

สวนทม [ ] ครอบอย บางครงไมมกได แตบางครงมนกมความส าคญส าหรบการเขยนโปรแกรม ในทนจะ

กลาวถงคราว ๆ เทานน

- 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

Page 4: ชนิดข้อมูลพื้นฐาน และ การด าเนินการที่เกี่ยวข้องกับตัวแปร ...nutthanon/886201/Lect02.pdf ·

การตงชอตวแปร 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

Page 5: ชนิดข้อมูลพื้นฐาน และ การด าเนินการที่เกี่ยวข้องกับตัวแปร ...nutthanon/886201/Lect02.pdf ·

ขอควรระวง 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

Page 6: ชนิดข้อมูลพื้นฐาน และ การด าเนินการที่เกี่ยวข้องกับตัวแปร ...nutthanon/886201/Lect02.pdf ·

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 ตอทายสญพจนนน

Page 7: ชนิดข้อมูลพื้นฐาน และ การด าเนินการที่เกี่ยวข้องกับตัวแปร ...nutthanon/886201/Lect02.pdf ·

เชน 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 ทใช

หนวยความจ าใหญกวา ตวอยางเชน

Page 8: ชนิดข้อมูลพื้นฐาน และ การด าเนินการที่เกี่ยวข้องกับตัวแปร ...nutthanon/886201/Lect02.pdf ·

- 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

Page 9: ชนิดข้อมูลพื้นฐาน และ การด าเนินการที่เกี่ยวข้องกับตัวแปร ...nutthanon/886201/Lect02.pdf ·

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;

Page 10: ชนิดข้อมูลพื้นฐาน และ การด าเนินการที่เกี่ยวข้องกับตัวแปร ...nutthanon/886201/Lect02.pdf ·

เปนการเพมคาของตวแปร 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

Page 11: ชนิดข้อมูลพื้นฐาน และ การด าเนินการที่เกี่ยวข้องกับตัวแปร ...nutthanon/886201/Lect02.pdf ·

นพจน (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 ดวยวาจะท าจากซายไปขวา หรอ ขาวไปซาย

Page 12: ชนิดข้อมูลพื้นฐาน และ การด าเนินการที่เกี่ยวข้องกับตัวแปร ...nutthanon/886201/Lect02.pdf ·

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 ขวาไปซาย

Page 13: ชนิดข้อมูลพื้นฐาน และ การด าเนินการที่เกี่ยวข้องกับตัวแปร ...nutthanon/886201/Lect02.pdf ·

ตวอยางการค านวณตามล าดบ 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;

Page 14: ชนิดข้อมูลพื้นฐาน และ การด าเนินการที่เกี่ยวข้องกับตัวแปร ...nutthanon/886201/Lect02.pdf ·

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

Page 15: ชนิดข้อมูลพื้นฐาน และ การด าเนินการที่เกี่ยวข้องกับตัวแปร ...nutthanon/886201/Lect02.pdf ·

การแปลงชนดตวเลข (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

Page 16: ชนิดข้อมูลพื้นฐาน และ การด าเนินการที่เกี่ยวข้องกับตัวแปร ...nutthanon/886201/Lect02.pdf ·

การแปลงชนดของขอมลชนดตาง ๆ (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) เพอระบตวอกษรทจะ

Page 17: ชนิดข้อมูลพื้นฐาน และ การด าเนินการที่เกี่ยวข้องกับตัวแปร ...nutthanon/886201/Lect02.pdf ·

น ามาก าหนดคาใหตวแปรในตวอยางขางตน ตวแปร 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';

Page 18: ชนิดข้อมูลพื้นฐาน และ การด าเนินการที่เกี่ยวข้องกับตัวแปร ...nutthanon/886201/Lect02.pdf ·

ชนดขอมลสายอกขระ (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”);

Page 19: ชนิดข้อมูลพื้นฐาน และ การด าเนินการที่เกี่ยวข้องกับตัวแปร ...nutthanon/886201/Lect02.pdf ·

ตวอยางโปรแกรมค านวณอยางงาย

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

Page 20: ชนิดข้อมูลพื้นฐาน และ การด าเนินการที่เกี่ยวข้องกับตัวแปร ...nutthanon/886201/Lect02.pdf ·

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