2016-01-08 29 views
10

Đây là câu hỏi hai chân: một cho C và một cho C++.Toán tử bậc ba không có toán hạng thứ hai

gì C và các tiêu chuẩn C++ có thể nói về việc sử dụng sau đây của ternary (?:) điều hành:

const char* opt = /* possible NULL pointer */; 
const char* str = opt ?: ""; 

khi nào nó trở thành quy phạm pháp luật? Nó là một phần mở rộng của trình biên dịch? Các yêu cầu về toán hạng đầu tiên (chuyển đổi hoàn toàn thành bool/int) là gì?

Trả lời

21

GCC cung cấp số này là extension. Đây không phải là tiêu chuẩn C++.

Ngữ nghĩa là nếu điều kiện không khác, giá trị của biểu thức là điều kiện.

Yêu cầu tiềm ẩn là điều kiện phải tương thích với toán hạng ba, tức là một điều kiện có thể được chuyển đổi sang phương thức khác theo quy tắc toán tử điều kiện thông thường.

Điều quan trọng cần lưu ý là nếu tình trạng này được tính từ một chức năng với tác dụng phụ, giá trị sẽ không được tính toán lại với phần mở rộng này:

opt() ?: ""; //opt called once 
opt() ? opt() : ""; //opt called twice 
10

Nhà điều hành ternary với bỏ qua toán hạng trung:

const char* str = opt ?: ""; 

là một phần mở rộng GNU nó không phải là tiêu chuẩn C++.

+0

Cảm ơn bạn. Và yêu cầu về toán hạng đầu tiên là gì? – YSC

+0

@YSC: Các điều kiện và giá trị chân lý được kết hợp: 'opt?:" "' Tương đương với 'opt? opt: "" '. –

+2

TartanLlama đã đưa ra câu trả lời đó. – 101010

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