Toán tử ba ngôi ?:
Dạng tổng quát của toán tử ba ngôi như sau:
expression1 ? expression2 : expression3
Đối với toán hạng đầu tiên - expression1
- bất kỳ biểu thức nào cho kết quả là giá trị kiểu bool đều có thể được sử dụng. Nếu kết quả là true
, thì toán tử được xác định bởi toán hạng thứ hai, tức là expression2
, sẽ được thực thi.
Nếu toán hạng đầu tiên là false
, toán hạng thứ ba - expression3
sẽ được thực hiện. Toán hạng thứ hai và thứ ba, tức là expression2
và expression3
, phải trả về giá trị cùng một kiểu và không được thuộc kiểu void. Kết quả của việc thực thi toán tử điều kiện là kết quả của expression2
hoặc kết quả của expression3
, tùy thuộc vào kết quả của expression1
.
//--- chuẩn hóa sự chênh lệch giữa giá mở cửa và đóng cửa cho một phạm vi ngày
double true_range = (High==Low)?0:(Close-Open)/(High-Low);
2
Cách ghi này tương đương với đoạn sau:
double true_range;
if(High==Low)true_range=0; // nếu High và Low bằng nhau
else true_range=(Close-Open)/(High-Low); // nếu phạm vi không rỗng
2
3
Hạn chế sử dụng toán tử
Dựa trên giá trị của expression1
, toán tử phải trả về một trong hai giá trị - hoặc expression2
hoặc expression3
. Có một số hạn chế đối với các biểu thức này:
- Không trộn kiểu do người dùng định nghĩa với kiểu đơn giản hoặc liệt kê. NULL có thể được sử dụng cho con trỏ.
- Nếu các kiểu giá trị là đơn giản, toán tử sẽ thuộc kiểu tối đa (xem Ép kiểu).
- Nếu một trong các giá trị là liệt kê và giá trị còn lại thuộc kiểu số, liệt kê sẽ được thay bằng
int
và áp dụng quy tắc thứ hai. - Nếu cả hai giá trị đều là liệt kê, kiểu của chúng phải giống nhau, và toán tử sẽ thuộc kiểu liệt kê.
Hạn chế đối với các kiểu do người dùng định nghĩa (lớp hoặc cấu trúc):
a. Các kiểu phải giống nhau hoặc một kiểu phải được kế thừa từ kiểu kia.
b. Nếu các kiểu không giống nhau (kế thừa), thì kiểu con sẽ được ép kiểu ngầm định sang kiểu cha, tức là toán tử sẽ thuộc kiểu cha.
c. Không trộn đối tượng và con trỏ – cả hai biểu thức phải là đối tượng hoặc con trỏ. NULL có thể được sử dụng cho con trỏ.
Lưu ý
Cẩn thận khi sử dụng toán tử điều kiện làm đối số của một hàm nạp chồng, vì kiểu kết quả của toán tử điều kiện được xác định tại thời điểm biên dịch chương trình. Và kiểu này được xác định là kiểu lớn hơn trong số các kiểu của expression2
và expression3
.
Ví dụ:
void func(double d) { Print("double argument: ",d); }
void func(string s) { Print("string argument: ",s); }
bool Expression1=true;
double Expression2=M_PI;
string Expression3="3.1415926";
void OnStart()
{
func(Expression2);
func(Expression3);
func(Expression1?Expression2:Expression3); // cảnh báo về ép kiểu ngầm định sang string
func(!Expression1?Expression2:Expression3); // cảnh báo về ép kiểu ngầm định sang string
}
// Kết quả:
// double argument: 3.141592653589793
// string argument: 3.1415926
// string argument: 3.141592653589793
// string argument: 3.1415926
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Xem thêm
Khởi tạo biến, Phạm vi hiển thị và vòng đời của biến, Tạo và xóa đối tượng