Computer >> 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ử bậc ba C / C ++

Chúng ta biết rằng toán tử bậc ba được triển khai thay vì mệnh đề if..else. Nó được ký hiệu là?:. '?' biểu tượng tương đương với phần if và ':' tương đương với phần khác. 3 chương trình sau giải thích một số quan sát thú vị trong trường hợp toán tử bậc ba.

Chương trình sau có thể biên dịch mà không có bất kỳ lỗi nào. Kiểu trả về của biểu thức bậc ba được mong đợi là float (giống như exp2) và exp3 (nghĩa là số không theo nghĩa đen - kiểu int) có thể chuyển đổi ngầm thành float.

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

Chương trình sau sẽ không thể biên dịch, lý do là trình biên dịch không thể định vị hoặc tìm thấy kiểu trả về của biểu thức bậc ba hoặc chuyển đổi ngầm định không khả dụng giữa exp2 (mảng char) và exp3 (int).

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

Chương trình sau có thể biên dịch được hoặc nhưng không thành công trong thời gian chạy. Kiểu trả về của biểu thức bậc ba bị giới hạn hoặc bị ràng buộc với kiểu (char *), nhưng biểu thức trả về int, vì vậy chương trình không thành công. Theo nghĩa đen, chương trình cố gắng in chuỗi ở địa chỉ thứ 0 vào thời gian thực thi hoặc thời gian chạy.

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

Chúng ta có thể thấy rằng exp2 được coi là kiểu đầu ra và exp3 sẽ có thể chuyển đổi thành exp2 tại thời điểm thực thi hoặc thời gian chạy. Nếu chuyển đổi được coi là ẩn thì các compilerinserts sơ khai cho chuyển đổi. Nếu quá trình chuyển đổi được coi là rõ ràng, trình biên dịch sẽ ném ra một lỗi. Nếu bất kỳ trình biên dịch nào có thể bỏ sót để bắt lỗi như vậy, chương trình có thể bị lỗi tại thời điểm thực thi hoặc thời gian chạy.