โครงสร้างการควบคุมการทำงานของโปรแกรม Program control structures Warattapop Chainate
Outline เพื่อควบคุมลำดับการทำงานของโปรแกรมให้ตรงตามที่โปรแกรมเมอร์ต้องการ สำหรับกลุ่มภาษาเชิงคำสั่ง (imperative) และภาษาเชิงวัตถุ (object oriented) โครงสร้างควบคุมจะประกอบด้วยโครงสร้างของ... คำสั่งกำหนดค่า คำสั่งรวมกลุ่มการทำงาน คำสั่งแบบมีเงื่อนไข คำสั่งทำซ้ำ นอกจากนี้ ภาษาคอมพิวเตอร์รุ่นใหม่ๆ มักจะมีโครงสร้างเพื่อการทำโปรแกรมย่อย และโครงสร้างเพื่อการจัดการกรณียกเว้น ทั้งหมด เพื่อให้โปรแกรมมีโครงสร้างที่ดี และเชื่อถือได้ในด้านความทนทานต่อข้อบกพร่อง
นิพจน์ (Expression) นิพจน์ เป็นส่วนประกอบพื้นฐานของคำสั่งแทบทุกคำสั่ง เป็นส่วนผลิตค่าให้กับคำสั่ง Literal Operator Monadic or unary Dyadic or binary รูปแบบการเขียนนิพจน์ แบ่งได้เป็น Infix notation Prefix notation Postfix notation
รูปแบบอินฟิกซ์ เขียนโอเปอเรเตอร์อยู่ตรงกลางระหว่างโอเปอแรนด์ทางซ้าย และทางขวา ในกรณีที่นิพจน์มีมากกว่าหนึ่งโอเปอเรเตอร์ และโอเปอเรเตอร์เหล่านั้นมีคสามสำคัญเท่าเทียมกัน เช่น x+y+z, 1+3-2+x, a=b=c=3 ผู้ออกแบบภาษาจะต้องกำหนดทิศทางการคำนวณว่า จะทำจากซ้ายไปขวา หรือจากขวาไปซ้าย เราจะเรียกทิศทางในการคำนวณนี้ว่า associative Left-associative Right-associative
Infix ในกรณีที่นิพจน์มีโอเปอเรเตอร์ที่ความสำคัญไม่เท่ากัน เช่น x+p*q ผู้ออกแบบภาษาจะต้องกำหนดลำดับความสำคัญก่อนหลังเรียกว่า precedence ** right associative
รูปแบบพรีฟิกซ์ และโพสฟิกซ์ รูปแบบพรีฟิกซ์ บางครั้งเรียกว่า รูปแบบโพลิช (Polish notation) ถูกสร้างขึ้นเพื่อให้การเขียนนิพจน์คณิตศาสตร์ไม่จำเป็นต้องใช้วงเล็บ เพื่อระบุลำดับก่อนหลังของการคำนวณ รูปแบบพรีฟิกซ์นี้ จะเขียนโอเปอเรเตอร์ไว้ก่อนหน้าโอเปอแรนด์ เช่น 4+(5*6) เขียนให้อยู่ในรูปนิพจน์พรีฟิกซ์ได้ +4*56 และ (4+5)*6 เขียนให้อยู่ในรูปนิพจน์โพสต์ฟิกซ์ได้ *+456 รูปแบบโพสฟิกซ์ มีลักษณะตรงข้าม กับพรีฟิกซ์ บางครั้งจึงเรียกว่า รูปแบบโพลิชสลับลำดับ (reverse Polish notation) รูปแบบโพสฟิกซ์จะเขียนโอเปอเรเตอร์ไว้หลังโอเปอแรนด์
Infix, Prefix and Postfix notations ในทางคณิตศาสตร์ การเขียนนิพจน์ส่วนใหญ่ จะใช้รูปแบบอินฟิกซ์ แต่มีการดำเนินการบางอย่างที่ใช้รูปแบบพรีฟิกซ์ และรูปแบบโพสฟิกซ์ ในทางคอมพิวเตอร์ ส่วนใหญ่ก็จะใช้รูปแบบอินฟิกซ์ แต่ก็มีบางการดำเนินการที่ใช้รูปแบบพรีฟิกซ์ และโพสฟิกซ์
การคำนวณผลลัพธ์ของนิพจน์ Operator overloading: การใช้เครื่องหมายโอเปอเรเตอร์เดียวทำงานมากกว่าหนึ่งแบบ ซึ่งมักจะเกิดขึ้นบ่อยมากในภาษาคอมพิวเตอร์ มีข้อดีคือ ลดการมีเครื่องหมายโอเปอเรเตอร์ให้ใช้มากชนิดเกินไป การคำนวณผลลัพธ์แบบอินฟิกซ์ จะต้องใช้ข้อมูลเกี่ยวกับ precedence และ association ประกอบการพิจารณาลำดับการคำนวณ เช่น นิพจน์ในภาษา Pascal a = b < c ((FALSE = FALSE) < FALSE) => (TRUE < FALSE) => FALSE หากเป็นนิพจน์ในภาษา C a == b < c ((0 == 0) < 0) => (1 < 0) => 0
การคำนวณผลลัพธ์ของนิพจน์ (cont) การกำหนดค่าของนิพจน์ให้ตัวแปร ภาษา Pascal ใช้เครื่องหมาย := แทนการกำหนดค่า เช่น x := 3 ภาษา C ใช้เครื่องหมาย = เช่น x = 3 เครื่องหมาย = จัดเป็นโอเปอเรเตอร์ที่มีลำดับการทำงานจากขวาไปซ้าย ผลลัพธ์ของนิพจน์จะเป็นค่าของโอเปอแรนด์ที่อยู่ทางซ้ายมือของ = ดังนั้น a = b = c = 0; จะหมายความว่า (a = (b = (c = 0))) ลองอธิบายคำสั่งต่อไปนี้ while ((*p++=*q++)!=0) {} Side effect?
การคำนวณผลลัพธ์ของนิพจน์ (cont) การเขียนนิพจน์ในภาษา C แล้ว นอกจากจะใช้เครื่องหมาย = แล้ว ยังสามารถใช้เครื่องหมาย ?: ที่เป็นโอเปอเรเตอร์ หมายถึงการทำงานแบบมีเงื่อนไข if… then… else… เช่น x!=0 ? 1/x : 0; หากผลลัพธ์ที่ได้จากโอเปอเรเตอร์ ?: เป็นค่า (value) นิพจน์นี้สามารถอยู่ทางขวาของเครื่องหมาย = ได้ q = (x!=0) ? 1/x : 0; หากเป็นตำแหน่ง (address) สามารถปรากฏทางซ้ายของเครื่องหมาย = (p>r) ? *p : *r = 0;
การคำนวณผลลัพธ์ของนิพจน์ (cont) ข้อความสั่งบางประเภทมีการใช้นิพจน์ย่อยหลายนิพจน์ การคำรวณผลลัพธ์ของนิพจน์ย่อยเหล่านั้น ไม่จำเป็นจะต้องกระทำทั้งหมดในคราวเดียว ถ้าในโปรแกรมมีการประกาศอาร์เรย์ a[1..10] และมีการเรียกใช้คำสั่ง ต่อไปนี้ IF (i<=10) AND (a[i]>0) THEN … นิพจน์ย่อยในคำสั่งนี้คือ (i<=10) และ (a[i]>0) Lazy evaluation ใช้มากในการทำโปรแกรมเชิงหน้าที่ เพื่อเพิ่มความเร็วในการประมวลผลโปรแกรม ในภาษา C มีการกำหนดวิธีการทำงานของบางโอเปอเรเตอร์ เช่น &&, II สำหรับการทำงานแบบเกียจคร้าน เรียกโอเปอเรเตอร์เหล่านี้ว่า short-cut operators หรือ short-circuit operators ภาษา Ada, if (I<=10) and then (A[I]>0) then … end if ;
คำสั่งกำหนดค่า (Assignment statement) เป็นคำสั่งที่ใช้ในการสร้าง หรือเปลี่ยนแปลงค่าให้กับตัวแปร เช่นคำสั่งในภาษา C i = (x+y)/2; จะเกิดการคำนวณผลลัพธ์ของนิพจน์ (x+y)/2 (source) และค่าที่ได้จะถูกกำหนดให้กับตัวแปร i (target or destination) ของการกำหนดค่า r-value : ค่าที่เก็บอยู่ในหน่วยความจำตำแหน่งต่างๆ l-value : ตำแหน่งหรือแอดเดรสของหน่วยความจำ
Assignment statement (cont) จากตัวอย่างเดิม ถ้ามีคำสั่งเพิ่มเติมดังนี้ x = y*i ; ในเรื่องนี้ หลักทางคณิตศาสตร์ และทางคอมพิวเตอร์ ต่างกันอย่างไร (ร่วมอภิปราย)
คำสั่งเป็นกลุ่ม (Compound statement) Sequence: คำสั่งต่อเนื่องเหล่านี้ สามารถถูกจัดให้เป็นชุดเดียวกัน โดยใช้