5

Nếu bạn có những điều sau đây:Liệu các nhà điều hành ternary ngắn mạch một cách định nghĩa

if (x) 
{ 
    y = *x; 
} 
else 
{ 
    y = 0; 
} 

Sau đó, hành vi được đảm bảo phải được xác định vì chúng ta chỉ có thể dereference x nếu nó không phải là 0

Can sự cùng thể nói cho:

y = (x) ? *x : 0; 

Điều này dường như làm việc như mong đợi (thậm chí được biên soạn với -Wpedantic trên g ++)

Điều này có được đảm bảo không?

+0

Có - Toán tử bậc ba chỉ là cú pháp đường –

+3

Có. (Quá ngắn để được đăng dưới dạng câu trả lời). – JSF

+0

Không có "ngắn mạch" trong biểu thức thứ ba. Và nó không sớm đánh giá hoặc thực hiện bất kỳ chi nhánh nào trước khi điều kiện được đánh giá đầy đủ. –

Trả lời

12

Vâng, chỉ có toán hạng thứ hai hoặc thứ ba sẽ được đánh giá, dự thảo tiêu chuẩn C++ phần 5.16[expr.cond] nói:

biểu thức có điều kiện nhóm từ phải sang trái. Biểu thức đầu tiên được chuyển ngữ cảnh thành bool (Điều 4). Nó được đánh giá và nếu nó là đúng, kết quả của biểu thức điều kiện là giá trị của biểu thức thứ hai, nếu không thì biểu thức thứ ba. Chỉ một trong các biểu thức thứ hai và thứ ba được đánh giá. Mọi giá trị tính toán và tác dụng phụ liên quan đến biểu thức đầu tiên được sắp xếp theo trình tự trước mỗi lần tính giá trị và tác dụng phụ liên quan đến biểu thức thứ hai hoặc thứ ba.

Các vấn đề liên quan