ฉันกำลังเรียนรู้ C ++ ด้วยหนังสือ C ++ Primer และหนึ่งในแบบฝึกหัดในหนังสือเล่มนี้คือ:
อธิบายว่านิพจน์ต่อไปนี้ใช้ทำอะไร:
someValue ? ++x, ++y : --x, --y
เรารู้อะไรบ้าง? เราทราบดีว่าตัวดำเนินการ ternary มีลำดับความสำคัญสูงกว่าตัวดำเนินการลูกน้ำ ด้วยตัวดำเนินการไบนารีสิ่งนี้ค่อนข้างเข้าใจได้ง่าย แต่สำหรับตัวดำเนินการด้านท้ายฉันกำลังดิ้นรนเล็กน้อย ด้วยตัวดำเนินการไบนารี "มีลำดับความสำคัญสูงกว่า" หมายความว่าเราสามารถใช้วงเล็บรอบนิพจน์ที่มีลำดับความสำคัญสูงกว่าและจะไม่เปลี่ยนแปลงการดำเนินการ
สำหรับตัวดำเนินการ ternary ฉันจะทำ:
(someValue ? ++x, ++y : --x, --y)
ทำให้เกิดรหัสเดียวกันอย่างมีประสิทธิภาพซึ่งไม่ได้ช่วยฉันในการทำความเข้าใจว่าคอมไพเลอร์จะจัดกลุ่มโค้ดอย่างไร
อย่างไรก็ตามจากการทดสอบกับคอมไพเลอร์ C ++ ฉันรู้ว่านิพจน์นั้นรวบรวมและฉันไม่รู้ว่าตัว:
ดำเนินการใดสามารถยืนได้ด้วยตัวเอง ดังนั้นคอมไพเลอร์ดูเหมือนจะตีความตัวดำเนินการ ternary อย่างถูกต้อง
จากนั้นฉันดำเนินการโปรแกรมด้วยสองวิธี:
#include <iostream>
int main()
{
bool someValue = true;
int x = 10, y = 10;
someValue ? ++x, ++y : --x, --y;
std::cout << x << " " << y << std::endl;
return 0;
}
ผลลัพธ์ใน:
11 10
ในทางกลับกันsomeValue = false
มันพิมพ์:
9 9
ทำไมจะ c ++ คอมไพเลอร์สร้างรหัสที่จริงสาขาของผู้ประกอบการ ternary เพียงการเพิ่มขึ้นx
ในขณะที่สำหรับเท็จสาขาของ ternary มัน decrements ทั้งสองx
และy
?
ฉันไปไกลถึงการใส่วงเล็บรอบ ๆ สาขาจริงเช่นนี้:
someValue ? (++x, ++y) : --x, --y;
11 10
แต่ก็ยังส่งผลในการ
?
เป็นผู้ประกอบการที่มีเงื่อนไข คำว่าตัวดำเนินการ ternaryหมายถึงตัวดำเนินการที่มีตัวถูกดำเนินการสามตัว ตัวดำเนินการตามเงื่อนไขเป็นตัวอย่างหนึ่งของตัวดำเนินการตามเงื่อนไข แต่ภาษาสามารถ (ในทางทฤษฎี) มีตัวดำเนินการตามเงื่อนไขหลายตัว