Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình C

Một số quan sát thú vị về toán tử ba ngôi (Ternary) trong C/C++


Toán tử ba ngôi (?:) thay cho if..else. '?' tương đương if, ':' tương đương else. 3 chương trình dưới minh họa quan sát thú vị.

Chương trình 1 biên dịch không lỗi. Kiểu trả về mong đợi là float (của exp2), exp3 (hằng 0 - int) chuyển ngầm sang float.

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

Chương trình 2 KHÔNG biên dịch được: trình biên dịch không tìm thấy kiểu trả về của biểu thức ba ngôi hoặc chuyển ngầm không có sẵn giữa exp2 (mảng char) và exp3 (int).

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

Chương trình 3 có thể biên dịch nhưng lỗi runtime. Kiểu trả về bị giới hạn là (char *), nhưng biểu thức trả về int -> lỗi. Chương trình cố in chuỗi tại địa chỉ 0 lúc chạy.

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

Quan sát: exp2 được xem là kiểu đầu ra, exp3 chuyển sang exp2 lúc runtime. Nếu chuyển ngầm -> compiler chèn stub chuyển đổi. Nếu chuyển tường minh -> compiler báo lỗi. Nếu compiler bỏ sót lỗi -> chương trình fail lúc chạy.