Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม C

ข้อสังเกตที่น่าสนใจบางประการเกี่ยวกับ C/C++ Ternary Operator


เรารู้ว่ามีการใช้ตัวดำเนินการ ternary แทน if..else clause มันถูกแทนด้วย ?:. '?' สัญลักษณ์เทียบเท่ากับถ้าส่วนหนึ่งและ ':' เทียบเท่ากับส่วนอื่น 3 โปรแกรมต่อไปนี้จะอธิบายข้อสังเกตที่น่าสนใจบางประการสำหรับตัวดำเนินการแบบไตรภาค

โปรแกรมต่อไปนี้สามารถคอมไพล์ได้โดยไม่มีข้อผิดพลาด ประเภทการส่งคืนของนิพจน์ Ternary คาดว่าจะเป็น float (เหมือนของ exp2) และ exp3 (เช่น literal zero - int type) สามารถแปลงเป็น float ได้โดยปริยาย

#include <iostream>
using namespace std;
int main(){
   int test1 = 0;
   float fvalue = 3.111f;
   cout<< (test1 ? fvalue : 0) << endl;
   return 0;
}

โปรแกรมต่อไปนี้จะไม่สามารถคอมไพล์ได้ เหตุผลก็คือคอมไพเลอร์ไม่สามารถค้นหาหรือค้นหาประเภทส่งคืนของ ternary expression หรือการแปลงโดยปริยายไม่พร้อมใช้งานระหว่าง exp2 (char array) และ exp3 (int)

#include <iostream>
using namespace std;
int main(){
   int test1 = 0;
   cout<< test1 ? "A String" : 0 << endl;
   return 0;
}

โปรแกรมต่อไปนี้อาจสามารถคอมไพล์ได้ หรือล้มเหลวขณะรันไทม์ ประเภทการส่งคืนของนิพจน์ Ternary ถูกจำกัดหรือจำกัดเป็นประเภท (char *) แต่นิพจน์จะส่งกลับค่า int ดังนั้นโปรแกรมจึงล้มเหลว ตามตัวอักษร โปรแกรมพยายามพิมพ์สตริงที่อยู่ที่ 0 ณ เวลาดำเนินการหรือรันไทม์

#include <iostream>
using namespace std;
int main(){
   int test1 = 0;
   cout << (test1 ? "A String" : 0) << endl;
   return 0;
}

เราสามารถสังเกตได้ว่า exp2 ถือเป็นประเภทเอาต์พุต และ exp3 จะสามารถแปลงเป็น exp2 ได้ ณ เวลาดำเนินการหรือรันไทม์ หากการแปลงได้รับการปฏิบัติโดยปริยาย compilerinserts stubs สำหรับการแปลง หากการแปลงได้รับการปฏิบัติอย่างชัดแจ้ง คอมไพเลอร์จะแสดงข้อผิดพลาด หากคอมไพเลอร์ตัวใดสามารถพลาดการตรวจจับข้อผิดพลาดดังกล่าว โปรแกรมอาจล้มเหลวในขณะดำเนินการหรือรันไทม์