โอเปอเรเตอร์แบบมีเงื่อนไข (? :) คือโอเปอเรเตอร์แบบไตรภาค (ใช้ตัวถูกดำเนินการสามตัว) ตัวดำเนินการเงื่อนไขทำงานดังนี้ -
- ตัวถูกดำเนินการแรกถูกแปลงเป็นบูลโดยปริยาย มีการประเมินและผลข้างเคียงทั้งหมดจะเสร็จสิ้นก่อนดำเนินการต่อ
- ถ้าตัวถูกดำเนินการแรกประเมินเป็นจริง (1) ตัวถูกดำเนินการที่สองจะถูกประเมิน
- หากตัวถูกดำเนินการแรกมีค่าเป็นเท็จ (0) ตัวถูกดำเนินการที่สามจะถูกประเมิน
- ผลลัพธ์ของตัวดำเนินการตามเงื่อนไขคือผลลัพธ์ของตัวถูกดำเนินการใดๆ ที่ได้รับการประเมิน — ตัวดำเนินการแบบที่สองหรือตัวที่สาม เพียงหนึ่งในสองตัวถูกดำเนินการสุดท้ายจะถูกประเมินในนิพจน์เงื่อนไข การประเมินตัวดำเนินการตามเงื่อนไขนั้นซับซ้อนมาก ขั้นตอนข้างต้นเป็นเพียงการแนะนำสั้นๆ นิพจน์เงื่อนไขมีการเชื่อมโยงจากขวาไปซ้าย ตัวถูกดำเนินการแรกต้องเป็นอินทิกรัลหรือประเภทตัวชี้
- กฎต่อไปนี้ใช้กับตัวถูกดำเนินการที่สองและสาม −
- ถ้าตัวถูกดำเนินการทั้งสองเป็นชนิดเดียวกัน ผลลัพธ์จะเป็นชนิดนั้น
- ถ้าตัวถูกดำเนินการทั้งสองเป็นเลขคณิตหรือตัวนับ เลขคณิตปกติ
- Conversion (ครอบคลุมใน Conversion มาตรฐาน) จะดำเนินการเพื่อแปลงเป็นประเภททั่วไป
- หากตัวถูกดำเนินการทั้งคู่เป็นประเภทตัวชี้หรือตัวหนึ่งเป็นประเภทตัวชี้ และอีกตัวเป็นนิพจน์คงที่ที่ประเมินเป็น 0 ตัวดำเนินการแปลงตัวชี้จะถูกแปลงเป็นประเภททั่วไป
- หากตัวถูกดำเนินการทั้งสองเป็นประเภทอ้างอิง จะมีการแปลงข้อมูลอ้างอิงเพื่อแปลงเป็นประเภททั่วไป
- ถ้าตัวถูกดำเนินการทั้งสองชนิดเป็นโมฆะชนิดทั่วไปคือชนิดเป็นโมฆะ
- หากตัวถูกดำเนินการทั้งสองเป็นประเภทที่ผู้ใช้กำหนดเหมือนกัน ประเภททั่วไปก็คือประเภทนั้น
- หากตัวถูกดำเนินการมีประเภทที่แตกต่างกัน และตัวถูกดำเนินการอย่างน้อยหนึ่งตัวมีประเภทที่ผู้ใช้กำหนด กฎของภาษาจะถูกใช้เพื่อกำหนดประเภททั่วไป (ดูคำเตือนด้านล่าง)
ตัวอย่าง
#include <iostream> using namespace std; int main() { int i = 1, j = 2; cout << ( i > j ? i : j ) << " is greater." << endl; }
ผลลัพธ์
สิ่งนี้จะให้ผลลัพธ์ -
2 is greater.