ป้ายกำกับ (วิทยาการคอมพิวเตอร์)
ในภาษาโปรแกรมป้ายกำกับคือลำดับของอักขระที่ระบุตำแหน่งภายในซอร์สโค้ดในภาษาส่วนใหญ่ ป้ายกำกับจะมีรูปแบบเป็นตัวระบุซึ่งมักตามด้วยอักขระเครื่องหมายวรรคตอน (เช่นโคลอน ) ในภาษาโปรแกรมระดับสูงหลายภาษาวัตถุประสงค์ของป้ายกำกับคือการทำหน้าที่เป็นปลายทางของGOTOคำสั่ง[ 1 ] [ 2 ] ใน ภาษาแอสเซมบลี ป้ายกำกับสามารถใช้ได้ทุกที่ที่ สามารถใช้ ที่อยู่ได้ (ตัวอย่างเช่น เป็นตัวดำเนินการของคำสั่ง a หรือ b ) [ 3 ] รวมถึงในภาษาปาสคาลและภาษาที่พัฒนาต่อยอดจากปาสคาล บางภาษา เช่นฟอร์ทรานและBASICรองรับป้ายกำกับตัวเลข[ 4 ] ป้ายกำกับยังใช้เพื่อระบุจุดเริ่มต้นใน ลำดับคำสั่งที่คอม ไพล์แล้ว (เช่น ระหว่างการดีบัก )JMPMOV
ซี
ใน ภาษา ซีป้ายกำกับ (label) ใช้ระบุคำสั่งในโค้ด คำสั่งเดียวสามารถมีป้ายกำกับได้หลายป้าย ป้ายกำกับเป็นเพียงตัวบ่งชี้ตำแหน่งในโค้ด และการเข้าถึงป้ายกำกับนั้นไม่มีผลต่อการทำงานจริงของโค้ด
ป้ายกำกับฟังก์ชัน
ป้ายกำกับฟังก์ชันประกอบด้วยตัวระบุ ตามด้วยเครื่องหมายโคลอน ป้ายกำกับแต่ละอันจะชี้ไปยังคำสั่งในฟังก์ชัน และตัวระบุของป้ายกำกับนั้นต้องไม่ซ้ำกันภายในฟังก์ชันนั้น ฟังก์ชันอื่นอาจใช้ชื่อเดียวกันสำหรับป้ายกำกับได้ ตัวระบุป้ายกำกับจะใช้พื้นที่ชื่อของตัวเอง – เราสามารถมีตัวแปรและฟังก์ชันที่มีชื่อเดียวกันกับป้ายกำกับได้
void foo ( int number ) { if ( number < 0 ) goto error ; bar ( number ); return ; error : fprintf ( stderr , "Invalid number! \n " ); }ในที่นี้errorคือป้ายกำกับ คำสั่งgotoใช้เพื่อกระโดดไปยังคำสั่งที่มีป้ายกำกับในโค้ด หลังจาก goto แล้วgotoการทำงานของโปรแกรมจะดำเนินต่อไปที่คำสั่งถัดจากป้ายกำกับนั้น
ป้ายกำกับสวิตช์
ในคำสั่ง switch สามารถใช้ป้ายกำกับได้สองประเภท ป้ายกำกับ case ประกอบด้วยคำหลัก `case` caseตามด้วยนิพจน์ที่ประเมินค่าเป็นค่าคงที่จำนวนเต็ม ป้ายกำกับ default ประกอบด้วยคำหลัก `default` defaultป้ายกำกับ case ใช้เพื่อเชื่อมโยงค่าจำนวนเต็มกับคำสั่งในโค้ด เมื่อถึงคำสั่ง switch การทำงานของโปรแกรมจะดำเนินต่อไปที่คำสั่งถัดจากป้ายกำกับ case โดยมีค่าตรงกับค่าในวงเล็บของ switch หากไม่มีป้ายกำกับ case แต่มีป้ายกำกับ default การทำงานของโปรแกรมจะดำเนินต่อไปที่คำสั่งถัดจากป้ายกำกับ default หากไม่มีป้ายกำกับ default การทำงานของโปรแกรมจะดำเนินต่อไปที่คำสั่งหลัง switch
switch ( die ) { default : printf ( "ไม่ถูกต้อง\n " ); break ;กรณีที่ 1 : กรณีที่3 : กรณีที่5 : printf ( "odd \n " ); break ;กรณีที่ 2 : กรณีที่4 : กรณีที่6 : พิมพ์( "even \n " ); หยุด; }ภายในคำสั่ง switch เดียวกัน ค่าคงที่จำนวนเต็มที่เชื่อมโยงกับป้ายกำกับแต่ละกรณีจะต้องไม่ซ้ำกัน อาจมีหรือไม่มีคำสั่ง default ก็ได้ ไม่มีข้อจำกัดเกี่ยวกับลำดับของป้ายกำกับภายในคำสั่ง switch ข้อกำหนดที่ว่าค่าของป้ายกำกับกรณีต้องประเมินค่าเป็นค่าคงที่จำนวนเต็ม ช่วยให้คอมไพเลอร์มีพื้นที่มากขึ้นสำหรับการปรับแต่งให้เหมาะสมที่สุด
ตัวอย่าง
จาวาสคริปต์
ในไวยากรณ์ของภาษาJavaScriptคำสั่งต่างๆ อาจนำหน้าด้วยป้ายกำกับ:
ด้านบน: // กำหนดป้ายกำกับให้กับลูป for ภายนอกสุดfor ( var i = 0 ; i < 4 ; i ++ ) { for ( var j = 0 ; j < 4 ; j ++ ) { if ( j === 3 && i === 2 ) { alert ( "i=" + i + ", j=" + j ); //i=2, j=3 break top ; } } }alert ( "i=" + i + ", j=" + j ); //i=2, j=3นอกจากนี้ยังสามารถใช้breakคำสั่งเพื่อออกจากบล็อกโค้ดได้อีกด้วย:
ด้านบน: { console.log ( "foo" ) console.log ( " bar " ) break top console.log ( " baz " ) }} // ซึ่งจะแสดงผลลัพธ์ดังนี้: // > foo // > barลิสปาร์กทั่วไป
ในCommon Lispมีวิธีการกำหนดป้ายกำกับอยู่สองวิธี วิธีแรกเกี่ยวข้องกับtagbodyตัวดำเนินการพิเศษ ซึ่งแตกต่างจากการใช้งานในภาษาโปรแกรมอื่นๆ ที่อนุญาตให้มีการนำทางทั่วโลก เช่นCป้ายกำกับจะสามารถเข้าถึงได้เฉพาะในบริบทของตัวดำเนินการนี้เท่านั้น ภายในtagbodyป้ายกำกับจะถูกกำหนดเป็นรูปแบบที่เริ่มต้นด้วยสัญลักษณ์goรูปแบบพิเศษนี้อนุญาตให้ถ่ายโอนการควบคุมระหว่างป้ายกำกับเหล่านี้[ 5 ]
( let (( iteration NIL )) ( tagbody start ( print 'started ) ( setf iteration 0 ) increase ( print iteration ) ( incf iteration 1 ) ( go check ) check ( if ( >= iteration 10 ) ( go end ) ( go increase )) end ( print 'done )))วิธีที่สองใช้มาโครตัวอ่านและโดยมาโครตัวแรกจะติดป้ายกำกับวัตถุที่อยู่ถัดไปทันที ส่วนมาโครตัวหลังจะอ้างอิงถึงค่าที่ประเมินแล้ว[ 6 ]ป้ายกำกับในความหมายนี้ถือเป็นทางเลือกแทนตัวแปร โดยการประกาศและกำหนดค่าเริ่มต้นให้กับ “ตัวแปร” และการเข้าถึงตัวแปรนั้น ตัวยึดตำแหน่งnจะกำหนดจำนวนเต็มทศนิยมที่ไม่ระบุเครื่องหมายที่เลือกไว้เพื่อระบุป้ายกำกับ#n=#n##n=#n#
( progn #1= "สวัสดี" ( print #1# ))นอกจากนั้น แบบฟอร์มบางแบบอนุญาตหรือกำหนดให้ต้องระบุป้ายกำกับเพื่อใช้อ้างอิงในภายหลัง รวมถึงแบบฟอร์มพิเศษblockที่กำหนดการตั้งชื่อ และloopมาโครที่สามารถระบุได้ด้วยnamedข้อความย่อย การออกจากแบบฟอร์มที่มีชื่อโดยทันทีสามารถทำได้โดยใช้return-fromตัวดำเนินการพิเศษ
( บล็อกmyblock ( วนลูปสำหรับการวนซ้ำตั้งแต่0 ทำซ้ำ( ถ้า( >= การวนซ้ำ10 ) ( ส่งคืนจากmyblock 'เสร็จสิ้น' ) ( พิมพ์การวนซ้ำ))))( วนลูปชื่อmyloop สำหรับการวนซ้ำตั้งแต่0 ทำซ้ำ( ถ้า( >= การวนซ้ำ10 ) ( ออกจากmyloop 'เสร็จสิ้น') ( พิมพ์การวนซ้ำ)))ในลักษณะที่คล้ายกับ C มาโครcase, ccase, ecase, [ 7 ]typecaseและกำหนดคำสั่ง switch [ 8 ]ctypecaseetypecase
( let (( my-value 5 )) ( case my-value ( 1 ( print "one" )) ( 2 ( print "two" )) (( 3 4 5 ) ( print "three four or five" )) ( otherwise ( print "any other value" ))))( let (( my-value 5 )) ( typecase my-value ( list ( print "a list" )) ( string ( print "a string" )) ( number ( print "a number" )) ( otherwise ( print "any other type" ))))