คำสั่ง Linux / Unix: expr

ชื่อ

expr - ประเมินนิพจน์

สรุป

expr arg ? อาร์กิวเมนต์ arg ... ?

(เพิ่มช่องว่างระหว่างคั่น) ประเมินผลลัพธ์เป็นนิพจน์ Tcl และส่งคืนค่า ตัวดำเนินการอนุญาตในนิพจน์ Tcl เป็นเซตย่อยของโอเปอเรเตอร์ที่ได้รับอนุญาตในนิพจน์ C และมีความหมายและความสำคัญเช่นเดียวกับตัวดำเนินการ C ที่สอดคล้องกัน นิพจน์เกือบจะ ให้ผลลัพธ์เป็นตัวเลข (ค่าจำนวนเต็มหรือทศนิยม) ตัวอย่างเช่นนิพจน์

expr 8.2 + 6

ประเมินเป็น 14.2 นิพจน์ Tcl จะแตกต่างจากนิพจน์ C ในลักษณะที่ระบุตัวดำเนินการ นอกจากนี้การแสดงผล Tcl สนับสนุนตัวดำเนินการที่ไม่ใช่ตัวเลขและการเปรียบเทียบสายอักขระ

ถูกดำเนินการ

การแสดงออกของ Tcl ประกอบไปด้วยตัวดำเนินการตัวดำเนินการและวงเล็บ พื้นที่สีขาวอาจถูกใช้ระหว่างตัวดำเนินการและโอเปอเรเตอร์และวงเล็บ มันไม่สนใจคำแนะนำของนิพจน์ ที่เป็นไปได้ตัวถูกดำเนินการถูกตีความว่าเป็นค่าจำนวนเต็ม ค่าตัวเลขจำนวนเต็มอาจถูกระบุเป็นทศนิยม (แบบปกติ) ในรูป octal (ถ้าอักขระตัวแรกของโอเปอแรนด์คือ 0 ) หรือเลขฐานสิบหก (ถ้าสองตัวแรกของตัวถูกดำเนินการเป็น 0x ) หากโอเปอรแรนดไมมีรูปแบบจํานวนเต็มที่ระบุไวดวยขอนั้นจะถือวาเปนจํานวนจุดลอยตัวหากเปนไปได หมายเลขจุดลอยตัวอาจได้รับการระบุในรูปแบบใด ๆ ที่ได้รับการรับรองโดยคอมไพเลอร์ C ที่สอดคล้องกับ ANSI (ยกเว้นว่าจะใช้คำต่อท้าย f , F , l และ L ต่อท้ายการติดตั้งส่วนใหญ่) ตัวอย่างเช่นทั้งหมดต่อไปนี้เป็นตัวเลขทศนิยมที่ถูกต้อง: 2.1, 3, 6e4, 7.91e + 16 ถ้าไม่มีการตีความตัวเลขเป็นไปได้ตัวถูกดำเนินการจะถูกปล่อยให้เป็นสตริง (และสามารถใช้ตัวดำเนินการ จำกัด ได้)

Operands สามารถระบุได้ด้วยวิธีใดวิธีหนึ่งต่อไปนี้:

[1]

เป็นค่าตัวเลขทั้งจำนวนเต็มหรือทศนิยม

[2]

เป็นตัวแปร Tcl โดยใช้สัญกรณ์มาตรฐาน $ ค่าของตัวแปรจะถูกใช้เป็นตัวถูกดำเนินการ

[3]

เป็นสตริงที่อยู่ในเครื่องหมายคำพูดคู่ parser นิพจน์จะดำเนินการแทนเครื่องหมายทับขวา, ตัวแปรและคำสั่งบนข้อมูลระหว่างคำพูดและใช้ค่าผลลัพธ์เป็นตัวถูกดำเนินการ

[4]

เป็นสตริงที่ล้อมรอบด้วยวงเล็บปีกกา อักขระระหว่างรั้งเปิดและการจับคู่วงเล็บปีกกาใกล้จะถูกใช้เป็นตัวถูกดำเนินการโดยไม่มีการแทนใด ๆ

[5]

เป็นคำสั่ง Tcl ที่อยู่ในวงเล็บ คำสั่งจะถูกดำเนินการและผลของมันจะถูกใช้เป็นตัวถูกดำเนินการ

[6]

เป็นฟังก์ชันทางคณิตศาสตร์ที่อาร์กิวเมนต์มีรูปแบบข้างต้นสำหรับตัวดำเนินการเช่น sin ($ x) ดูด้านล่างสำหรับรายการของฟังก์ชันที่กำหนดไว้

ในกรณีที่มีการแทนที่เกิดขึ้นข้างต้น (เช่นในสายที่ยกมา) พวกเขาจะดำเนินการตามคำแนะนำของนิพจน์ อย่างไรก็ตามอาจมีการทดแทนการทดแทนเพิ่มเติมจากตัวจำแนกคำสั่งก่อนที่จะประมวลผลตัวประมวลผลนิพจน์ ดังที่กล่าวไว้ด้านล่างนี้โดยปกติแล้วควรใส่นิพจน์ในเครื่องหมายวงเล็บเพื่อป้องกันไม่ให้ตัวแบ่งลำดับคำสั่งดำเนินการแทนเนื้อหา

สมมติว่าตัวแปร a มีค่า 3 และตัวแปร b มีค่า 6 จากนั้นคำสั่งที่ด้านซ้ายของแต่ละบรรทัดด้านล่างจะให้ค่าทางด้านขวาของบรรทัด:

expr 3.1 + $ a6.1 expr 2 + "$ a. $ b" 5.6 expr 4 * [llength "6 2"] 8 expr {{คำหนึ่ง} <"word $ a"} 0

ผู้ประกอบการ

โอเปอเรเตอร์ที่ถูกต้องระบุไว้ด้านล่างนี้จัดกลุ่มไว้ในลำดับความสำคัญที่ลดลง:

- + ~!

Unary ลบ, เอกภาพ plus, bit-wise NOT, logical NOT ไม่มีตัวถูกดำเนินการเหล่านี้อาจถูกนำมาใช้กับตัวดำเนินการสตริงและบิตที่ชาญฉลาดอาจใช้เฉพาะกับจำนวนเต็มเท่านั้น

* /%

คูณหารส่วนที่เหลือ ไม่มีตัวถูกดำเนินการเหล่านี้อาจถูกนำมาใช้กับตัวดำเนินการสตริงและส่วนที่เหลืออาจใช้กับจำนวนเต็มเท่านั้น ส่วนที่เหลือจะมีเครื่องหมายเท่ากับตัวหารเสมอและค่าสัมบูรณ์น้อยกว่าตัวหาร

+ -

เพิ่มและลบ ใช้ได้กับตัวนับตัวเลขใดก็ได้

<< >>

การเลื่อนซ้ายและขวา ใช้ได้สำหรับโอเปอรริบิวจำนวนเต็มเท่านั้น การเลื่อนทางขวาจะเผยแพร่บิตลงชื่อเข้าใช้เสมอ

<> <=> =

บูลีนน้อยกว่ามากน้อยกว่าหรือเท่ากับและมากกว่าหรือเท่ากับ โอเปอเรเตอร์แต่ละตัวสร้าง 1 ถ้าเงื่อนไขเป็นจริง 0 มิฉะนั้น โอเปอเรเตอร์เหล่านี้อาจใช้กับสตริงและตัวดำเนินการตัวเลขซึ่งในกรณีนี้จะใช้การเปรียบเทียบสตริง

==! =

บูลีนเท่ากับและไม่เท่ากัน ผู้ดำเนินงานแต่ละรายสร้างผลลัพธ์เป็นศูนย์ / หนึ่งรายการ ใช้ได้กับทุกโอเปอแรนด์

&

บิตฉลาด AND ใช้ได้สำหรับโอเปอรริบิวจำนวนเต็มเท่านั้น

^

Bit-wise exclusive OR ใช้ได้สำหรับโอเปอรริบิวจำนวนเต็มเท่านั้น

|

บิตฉลาด OR ใช้ได้สำหรับโอเปอรริบิวจำนวนเต็มเท่านั้น

&&

ตรรกะ AND ผลลัพธ์ 1 ถ้าทั้งสองตัวถูกดำเนินการไม่เป็นศูนย์ 0 มิฉะนั้น ใช้ได้กับโอลเดอร์แบบบูลีนและตัวเลข (จำนวนเต็มหรือทศนิยม) เท่านั้น

||

เหตุผล OR ผลลัพธ์ 0 ถ้าทั้งสองตัวถูกดำเนินการเป็นศูนย์ 1 มิฉะนั้น ใช้ได้กับโอลเดอร์แบบบูลีนและตัวเลข (จำนวนเต็มหรือทศนิยม) เท่านั้น

x ? y : z

ถ้า - แล้ว - อื่นเช่นเดียวกับใน C. ถ้า x ประเมินเป็นค่าที่ไม่ใช่ศูนย์แล้วผลลัพธ์คือค่าของ y มิฉะนั้นผลที่ได้คือค่าของ z โอเปอเรเตอร์ x ต้องมีค่าตัวเลข

ดูคู่มือ C สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับผลลัพธ์ที่ได้จากผู้ประกอบการแต่ละราย กลุ่ม ผู้ดำเนินการแบบไบนารี ทั้งหมดจากซ้ายไปขวาจะอยู่ในระดับความสำคัญเดียวกัน ตัวอย่างเช่นคำสั่ง

expr 4 * 2 <7

ส่งกลับ 0

&& , || , และ ?: ผู้ประกอบการมี `` การประเมินผลขี้เกียจ '' เช่นเดียวกับใน C ซึ่งหมายความว่าตัวถูกดำเนินการไม่ได้รับการประเมินหากไม่จำเป็นต้องใช้เพื่อกำหนดผลลัพธ์ ตัวอย่างเช่นในคำสั่ง

expr {$ v? [a]: [b]}

เพียงหนึ่งใน [a] หรือ [b] จะได้รับการประเมินขึ้นอยู่กับค่าของ $ v อย่างไรก็ตามโปรดทราบว่านี่เป็นจริงถ้านิพจน์ทั้งตัวอยู่ในวงเล็บปีกกา มิฉะนั้น parser Tcl จะประเมินทั้ง [a] และ [b] ก่อนที่จะเรียกใช้คำสั่ง expr

ฟังก์ชันคณิตศาสตร์

Tcl สนับสนุนฟังก์ชั่นทางคณิตศาสตร์ต่อไปนี้ในการแสดงออก:

abs cosh log sqrt acos สองครั้ง log10 srand asin exp tan tan atan พื้น rand tanh atan2 fmod รอบ ceil hypot sin cos int นักเรียน

abs ( arg )

ส่งกลับค่าสัมบูรณ์ของ arg อาร์กิวเมนต์ อาจเป็นจำนวนเต็มหรือทศนิยมและผลลัพธ์จะถูกส่งกลับในรูปแบบเดียวกัน

acos ( arg )

ส่งค่าโคไซน์อาร์ของอาร์เรย์ในช่วง [0, pi] เรเดียน Arg ควรอยู่ในช่วง [-1,1]

asin ( arg )

ส่งค่าอาร์คไซน์ของอาร์เรย์ในช่วงเรเดียน [-pi / 2, pi / 2] Arg ควรอยู่ในช่วง [-1,1]

atan ( arg )

ส่งค่า อาร์กิวเมนต์ สัมผัสของอาร์เรย์ในช่วงเรเดียน [-pi / 2, pi / 2]

atan2 ( x, y )

ส่งกลับค่าอาร์กสัมผัสของ y / x ในช่วงเรเดียน [-pi, pi] x และ y ไม่สามารถเป็น 0 ได้

ceil ( arg )

ส่งกลับค่าจำนวนเต็มน้อยที่สุดไม่น้อยกว่า arg

cos ( arg )

ส่งคืนโคไซน์ของ อาร์เรย์ วัดเป็นเรเดียน

cosh ( arg )

ส่งคืนค่าโคไซน์ซึ่งไฮเปอร์โบลิกของ อาร์เรย์ หากผลที่ได้จะทำให้เกิดการล้น

double ( arg )

ถ้า อาร์กิวเมนต์ เป็นค่าลอย arg ผลตอบแทนจะแปลง อาร์กิวเมนต์ ให้ลอยและส่งกลับค่าที่แปลงแล้ว

exp ( arg )

ส่งกลับค่าเลขชี้กำลังของ arg ซึ่งกำหนดไว้เป็น e ** arg หากผลที่ได้จะทำให้เกิดการล้น

ชั้น ( อาร์เรย์ )

ส่งกลับค่ารวมที่ใหญ่ที่สุดไม่เกิน arg

fmod ( x, y )

ส่งคืนส่วนที่เหลือลอยตัวของส่วนของ x ตาม y ถ้า y คือ 0 จะส่งคืนข้อผิดพลาด

hypot ( x, y )

คำนวณความยาวของด้านตรงข้ามมุมของรูปสามเหลี่ยมมุมขวา ( x * x + y * y )

int ( arg )

ถ้า อาร์กิวเมนต์ เป็นค่าจำนวนเต็ม arg ย้อนกลับมิฉะนั้นจะแปลง อาร์กิวเมนต์ เป็นจำนวนเต็มโดยการตัดทอนและส่งกลับค่าที่แปลงแล้ว

log ( arg )

ส่งกลับค่าลอการิทึมธรรมชาติของ arg Arg ต้องเป็นค่าบวก

log10 ( อาร์กิวเมนต์ )

ส่งกลับค่าลอการิทึมฐาน 10 ของ อาร์เรย์ Arg ต้องเป็นค่าบวก

pow ( x, y )

คำนวณค่าของ x ยกกำลัง y ถ้า x เป็นค่าลบ y ต้องเป็นค่าจำนวนเต็ม

แรนด์ ()

แสดงจำนวนจุดลอยจากศูนย์เป็นเพียงน้อยกว่าหนึ่งหรือในเทอมเชิงคณิตศาสตร์ช่วง [0,1) เมล็ดมาจากนาฬิกาภายในของเครื่องหรืออาจจะตั้งค่าด้วยตนเองด้วยฟังก์ชัน srand

รอบ ( อาร์กิวเมนต์ )

ถ้า อาร์กิวเมนต์ เป็นค่าจำนวนเต็ม arg ค่าตอบแทนมิฉะนั้นจะแปลง อาร์กิวเมนต์ เป็นจำนวนเต็มโดยการปัดเศษและส่งกลับค่าที่แปลงแล้ว

บาป ( อาร์กิวเมนต์ )

ส่งคืนไซน์ของ อาร์เรย์ วัดเป็นเรเดียน

sinh ( arg )

ส่งคืนไซน์ไฮเปอร์โบลิกของ arg หากผลที่ได้จะทำให้เกิดการล้น

sqrt ( arg )

แสดงรากที่สองของ arg Arg ต้องไม่เป็นลบ

srand ( arg )

อาร์กิวเมนต์ ซึ่งต้องเป็นจำนวนเต็มจะถูกใช้เพื่อตั้งค่าเมล็ดสำหรับเครื่องกำเนิดตัวเลขแบบสุ่ม ส่งกลับหมายเลขสุ่มแรกจากเมล็ดพันธุ์นั้น ล่ามแต่ละคนมีเมล็ดของตัวเอง

tan ( arg )

ส่งกลับค่า อาร์กิวเมนต์ สัมผัสของเรเดียน

tanh ( arg )

ส่งค่าการแทนเจนต์ซึ่งเกินความจริงของ arg

นอกเหนือจากฟังก์ชันที่กำหนดไว้ล่วงหน้าแล้วแอ็พพลิเคชันอาจกำหนดฟังก์ชันเพิ่มเติมโดยใช้ Tcl_CreateMathFunc ()

ประเภทล้นและความแม่นยำ

การคำนวณภายในทั้งหมดที่เกี่ยวข้องกับจำนวนเต็มจะกระทำกับประเภท C ยาว และการคำนวณภายในทั้งหมดที่เกี่ยวข้องกับ floating-point จะกระทำโดยใช้ C ชนิด double เมื่อแปลงสตริงเป็นจุดลอยตัวจะมีการตรวจพบการล้นล้นอันเป็นลําดับและทำให้เกิดข้อผิดพลาด Tcl สำหรับการแปลงเป็นจำนวนเต็มจากสตริงการตรวจจับการทั่งล้นจะขึ้นอยู่กับพฤติกรรมของกิจวัตรในไลบรารี C ในเครื่องดังนั้นจึงควรถือว่าไม่น่าเชื่อถือ ไม่ว่าในกรณีใด ๆ จำนวนเต็ม overflow และ underflow โดยทั่วไปจะไม่สามารถตรวจจับได้อย่างน่าเชื่อถือสำหรับผลลัพธ์ระดับกลาง การตรวจจับระดับล้นและจุดต่ำสุดที่ลอยตัวอยู่ในระดับที่ฮาร์ดแวร์สนับสนุนซึ่งโดยทั่วไปน่าเชื่อถือมาก

การแปลงค่าระหว่างการแทนภายในสำหรับตัวดำเนินการจำนวนเต็มทศนิยมและสตริงจะดำเนินการโดยอัตโนมัติตามที่ต้องการ สำหรับการคำนวณทางคณิตศาสตร์จำนวนเต็มจะถูกใช้จนกว่าจะมีการใช้ตัวเลขลอยตัวบางจุดหลังจากที่ใช้จุดลอยตัวแล้ว ตัวอย่างเช่น,

expr 5/4

ส่งกลับ 1 ขณะ

expr 5 / 4.0 expr 5 / ([string length "abcd"] + 0.0)

ทั้งสองกลับ 1.25 ค่า Floating-point จะถูกส่งกลับเสมอด้วย `` 'หรือ e เพื่อไม่ให้มีค่าเป็นจำนวนเต็ม ตัวอย่างเช่น,

expr 20.0 / 5.0

ส่งกลับ 4.0 ไม่ใช่ 4

การดำเนินการของสตริง

ค่าสตริงอาจใช้เป็นโอเปอเรเตอร์ของโอเปอเรเตอร์การเปรียบเทียบแม้ว่าผู้ประเมินนิพจน์จะพยายามทำเปรียบเทียบเป็นจำนวนเต็มหรือทศนิยมเมื่อทำได้ หากโอเปอรแรนดตัวอยางของการเปรียบเทียบเปนสตริงและอีกตัวหนึ่งมีคาตัวเลขออบเจ็กตตัวเลขจะถูกแปลงกลับไปเปนสตริงโดยใชตัวระบุรูปแบบ sprintf C % d สําหรับ integers และ % g สําหรับคา floating-point ตัวอย่างเช่นคำสั่ง

expr {"0x03"> "2"} expr {"0y" <"0x12"}

ทั้งสองกลับ 1 การเปรียบเทียบแรกจะทำโดยใช้การเปรียบเทียบจำนวนเต็มและที่สองจะทำโดยใช้การเปรียบเทียบสตริงหลังจากที่ตัวถูกดำเนินการที่สองถูกแปลงเป็นสตริง 18 เนื่องจากแนวโน้มของ Tcl ในการรักษาค่าเป็นตัวเลขเมื่อทำได้อย่าใช้ตัวดำเนินการเช่น == เมื่อคุณต้องการเปรียบเทียบสตริงและค่าของตัวถูกดำเนินการอาจเป็นคำสั่งโดยพลการ ในกรณีเหล่านี้ดีกว่าในกรณีนี้ให้ใช้คำสั่ง string แทน

ข้อควรพิจารณาด้านประสิทธิภาพ

ใส่นิพจน์ในเครื่องหมายวงเล็บเพื่อให้ได้ความเร็วที่ดีที่สุดและข้อกำหนดในการจัดเก็บข้อมูลที่เล็กที่สุด ซึ่งจะช่วยให้คอมไพเลอร์ bytecode Tcl สร้างรหัสที่ดีที่สุด

ดังกล่าวข้างต้นการแสดงออกจะถูกแทนที่สองครั้ง: ครั้งโดย parser Tcl และครั้งโดยคำสั่ง expr ตัวอย่างเช่นคำสั่ง

ตั้งค่า 3 ชุด b {$ a + 2} expr $ b * 4

return 11 ไม่ใช่ multiple of 4 เนื่องจากตัวแบ่งส่วน Tcl จะแทนค่า $ a + 2 สำหรับตัวแปร b ก่อนแล้วคำสั่ง expr จะประเมินนิพจน์ $ a +2 * 4

การแสดงออกส่วนใหญ่ไม่จำเป็นต้องใช้การแทนที่สอง ไม่ว่าจะเป็นวงเล็บปีกกาหรือถ้าไม่มีตัวแปรและคำสั่งแทนจะให้ตัวเลขหรือสตริงที่ไม่จำเป็นต้องใช้ตัวแทน อย่างไรก็ตามเนื่องจากนิพจน์ที่ปราศจากข้อ จำกัด ไม่จำเป็นต้องใช้การแทนที่สองครั้งคอมไพเลอร์ bytecode จะต้องเผยแพร่คำแนะนำเพิ่มเติมเพื่อจัดการกับสถานการณ์นี้ ต้องใช้รหัสที่มีราคาแพงที่สุดสำหรับการแสดงออกที่ไม่ได้ติดตั้งที่มีการแทนที่คำสั่ง นิพจน์เหล่านี้ต้องถูกนำมาใช้โดยการสร้างโค้ดใหม่ทุกครั้งที่นิพจน์ทำงาน

คำสำคัญ

เลขคณิต, แบบบูล , เปรียบเทียบ, การแสดงออก, การเปรียบเทียบเลือน

สำคัญ: ใช้คำสั่ง man ( % man ) เพื่อดูว่าคำสั่งถูกใช้อย่างไรในคอมพิวเตอร์เครื่องใดเครื่องหนึ่งของคุณ