ใช่มันสั่งว่า (ทั้งคำสั่งการประเมินผลและการลัดวงจร) ในตัวอย่างของคุณถ้าทุกฟังก์ชั่นคืนค่าจริงลำดับของการโทรนั้นจะถูก จำกัด จาก functionA จากนั้น functionB และ functionC ใช้สำหรับเช่นนี้
if(ptr && ptr->value) {
...
}
เหมือนกันสำหรับผู้ใช้เครื่องหมายจุลภาค:
// calls a, then b and evaluates to the value returned by b
// which is used to initialize c
int c = (a(), b());
หนึ่งกล่าวว่าระหว่างถูกดำเนินการทางซ้ายและขวาของ&&
, ||
, ,
และระหว่างครั้งแรกและครั้งที่สอง / ถูกดำเนินการในสามของ?:
(ผู้ประกอบการตามเงื่อนไข) เป็น "จุดตามลำดับ" ผลข้างเคียงใด ๆ จะได้รับการประเมินอย่างสมบูรณ์ก่อนถึงจุดนั้น ดังนั้นนี่ปลอดภัย:
int a = 0;
int b = (a++, a); // b initialized with 1, and a is 1
โปรดทราบว่าผู้ใช้เครื่องหมายจุลภาคไม่ต้องสับสนกับเครื่องหมายจุลภาคที่ใช้ในการแยกสิ่งต่าง ๆ :
// order of calls to a and b is unspecified!
function(a(), b());
มาตรฐาน C ++ บอกไว้ใน5.14/1
:
กลุ่มตัวดำเนินการ && จากซ้ายไปขวา ตัวถูกดำเนินการทั้งสองถูกแปลงเป็นประเภทบูลโดยนัย (ข้อ 4) ผลลัพธ์จะเป็นจริงถ้าตัวถูกดำเนินการทั้งคู่เป็นจริงและเท็จ ซึ่งแตกต่างจาก &, & & รับประกันการประเมินผลจากซ้ายไปขวา: ตัวถูกดำเนินการที่สองจะไม่ได้รับการประเมินหากตัวถูกดำเนินการแรกเป็นเท็จ
และใน5.15/1
:
| | | กลุ่มโอเปอเรเตอร์จากซ้ายไปขวา ตัวถูกดำเนินการทั้งสองถูกแปลงเป็นบูลโดยนัย (ข้อ 4) มันจะส่งกลับจริงถ้าตัวถูกดำเนินการอย่างใดอย่างหนึ่งเป็นจริงและเท็จอย่างอื่น ไม่เหมือน |, || รับประกันการประเมินผลจากซ้ายไปขวา นอกจากนี้ตัวถูกดำเนินการที่สองจะไม่ถูกประเมินถ้าตัวถูกดำเนินการแรกประเมินเป็นจริง
มันบอกว่าสำหรับทั้งสองข้างถัดไป:
ผลลัพธ์ที่ได้คือบูล ผลข้างเคียงทั้งหมดของการแสดงออกครั้งแรกยกเว้นการทำลายขมับ (12.2) เกิดขึ้นก่อนการแสดงออกครั้งที่สองจะถูกประเมิน
นอกจากนั้น1.9/18
พูดว่า
ในการประเมินผลของแต่ละการแสดงออก
a && b
a || b
a ? b : C
a , b
ใช้ความหมายในตัวของตัวดำเนินการในนิพจน์เหล่านี้ (5.14, 5.15, 5.16, 5.18) มีจุดลำดับหลังจากการประเมินผลของนิพจน์แรก