tôi thấy mã thú vị sau ngày hôm nay:Lẫn lộn bằng dấu phẩy trong biểu ternary
SomeFunction(some_bool_variable ? 12.f, 50.f : 50.f, 12.f)
Tôi tạo ra một mẫu nhỏ để tạo lại hành vi:
class Vector3f
{
public:
Vector3f(float val)
{
std::cout << "vector constructor: " << val << '\n';
}
};
void SetSize(Vector3f v)
{
std::cout << "SetSize single param\n";
}
void SetSize(float w, float h, float d=0)
{
std::cout << "SetSize multi param: " << w << ", " << h << ", " << d << '\n';
}
int main()
{
SetSize(true ? 12.f, 50.f : 50.f, 12.f);
SetSize(false ? 12.f, 50.f : 50.f, 12.f);
}
Kết quả Tôi nhận được từ việc chạy mã trên là:
clang++ -std=c++14 -O2 -Wall -pedantic -lboost_system -lboost_filesystem -pthread main.cpp && ./a.out
main.cpp:29:20: warning: expression result unused [-Wunused-value]
SetSize(true ? 12.f, 50.f : 50.f, 12.f);
^~~~
main.cpp:30:21: warning: expression result unused [-Wunused-value]
SetSize(false ? 12.f, 50.f : 50.f, 12.f);
^~~~
2 warnings generated.
SetSize multi param: 50, 12, 0
SetSize multi param: 50, 12, 0
Điều tôi mong đợi ở cả hai trường hợp là một thông số duy nhất sẽ được chuyển đến SetSize(float)
. Tuy nhiên, hai thông số được truyền mà tôi thấy cực kỳ khó hiểu (đặc biệt là vì ternary có ưu tiên hơn dấu phẩy; vì vậy tôi giả định rằng dấu phẩy không định nghĩa các đối số hàm trong trường hợp này). Ví dụ: nếu sử dụng true
, số ba phải là 12.f, 50.f
. Trong cụm từ này, giá trị bên trái của dấu phẩy được giảm/bỏ qua, vì vậy tôi mong đợi kết quả cuối cùng là:
SetSize(50.f);
Phần thứ hai của sự nhầm lẫn là liệu chúng tôi sử dụng true
hoặc false
trong ternary, cùng 2 giá trị được truyền cho hàm. Các trường hợp true
nên là h=12, w=50
Tôi nghĩ rằng ...
Tôi thấy trình biên dịch đang cố gắng cảnh báo cho tôi về điều gì đó, nhưng tôi không thể hiểu được điều gì đang xảy ra. Ai đó có thể phân hủy logic này và giải thích kết quả theo từng bước?
Bạn không thể cung cấp danh sách đối số với toán tử bậc ba. Nó chỉ chọn giá trị. – EJP
@EJP: Hãy sử dụng phần trả lời để trả lời câu hỏi. Cảm ơn. –
Ngữ pháp ngôn ngữ cho toán tử điều kiện không cho phép biểu thức toán tử dấu phẩy cho phần cuối cùng (để tránh sự mơ hồ) –