Tôi hiện đang học C ++ với cuốn sách C ++ Primer và một trong những bài tập trong cuốn sách là:
Giải thích biểu thức sau có chức năng gì:
someValue ? ++x, ++y : --x, --y
Chúng ta biết những gì? Chúng ta biết rằng toán tử bậc ba có mức độ ưu tiên cao hơn toán tử dấu phẩy. Với toán tử nhị phân, điều này khá dễ hiểu, nhưng với toán tử bậc ba, tôi đang gặp khó khăn một chút. Với các toán tử nhị phân "có mức độ ưu tiên cao hơn" có nghĩa là chúng ta có thể sử dụng dấu ngoặc đơn xung quanh biểu thức có mức độ ưu tiên cao hơn và nó sẽ không thay đổi việc thực thi.
Đối với toán tử bậc ba, tôi sẽ làm:
(someValue ? ++x, ++y : --x, --y)
có hiệu quả dẫn đến cùng một mã, điều này không giúp tôi hiểu cách trình biên dịch sẽ nhóm mã.
Tuy nhiên, từ thử nghiệm với trình biên dịch C ++, tôi biết rằng biểu thức biên dịch và tôi không biết một :
toán tử có thể đại diện cho chính nó. Vì vậy, trình biên dịch dường như giải thích toán tử bậc ba một cách chính xác.
Sau đó, tôi thực hiện chương trình theo hai cách:
#include <iostream>
int main()
{
bool someValue = true;
int x = 10, y = 10;
someValue ? ++x, ++y : --x, --y;
std::cout << x << " " << y << std::endl;
return 0;
}
Kết quả trong:
11 10
Mặt khác với someValue = false
nó in:
9 9
Tại sao trình biên dịch C ++ lại tạo ra mã cho nhánh true của toán tử bậc ba chỉ tăng x
, trong khi đối với nhánh sai của toán tử bậc ba, nó giảm cả x
và y
?
Tôi thậm chí còn đi xa đến mức đặt dấu ngoặc đơn xung quanh nhánh true như thế này:
someValue ? (++x, ++y) : --x, --y;
nhưng nó vẫn dẫn đến 11 10
.
?
là toán tử điều kiện . Thuật ngữ toán tử bậc ba chỉ đơn giản có nghĩa là toán tử có ba toán hạng. Toán tử điều kiện là một ví dụ về toán tử bậc ba, nhưng một ngôn ngữ có thể (về mặt lý thuyết) có nhiều toán tử bậc ba.