2010-05-09 49 views
9

Tại sao tuyên bố này:câu hỏi về? và: trong C++

int a = 7, b = 8, c = 0; 
c = b>a?a>b?a++:b++:a++?b++:a--; 
cout << c; 

không bằng:

int a = 7, b = 8, c = 0; 
c = (b>a?(a>b?a++:b++):a++)?b++:a--; 
cout << c; 

và bằng:

int a = 7, b = 8, c = 0; 
c = b>a?(a>b?a++:b++):(a++?b++:a--); 
cout << c; 

Xin vui lòng cho tôi một số lý do. Tại sao ?

+4

http://www.cppreference.com/wiki/operator_precedence – phimuemue

+31

Chúa Giêsu Kitô, tại sao bạn lại muốn viết mã như thế ?! – Skilldrick

+0

Bạn nên viết mã độc đáo với các dấu ngoặc vuông trừ khi bạn biết các tiền tố – Zai

Trả lời

15

? : là liên kết từ phải sang trái. Nó được định nghĩa như vậy trong ngôn ngữ.

+0

Bạn biết đấy, tôi nghĩ bạn đúng và tôi sai. Tôi sẽ xóa của tôi. –

+0

Hoàn toàn đúng. Cảm ơn – assembler

7

Tôi tin rằng @sth đã cung cấp câu trả lời đúng, tuy nhiên, tôi nghĩ @Skilldrick đã làm đúng trên các nhận xét - tại sao bạn lại bao giờ viết một cái gì đó như thế.

Cũng như vấn đề ưu tiên, bạn thực sự cần phải cẩn thận khi tăng cùng một biến trong một câu lệnh. Có thể có hoặc không có các điểm chuỗi trong tuyên bố, và do đó thứ tự đánh giá các gia số có thể không được đảm bảo. Bạn có thể kết thúc với các kết quả khác nhau với các trình biên dịch khác nhau hoặc thậm chí các cài đặt tối ưu hóa khác nhau trên cùng một trình biên dịch.

+2

Tuyệt đối - nhiều gia số của cùng một biến tại cùng một điểm chuỗi là hành vi * không xác định đáng sợ *. Dòng đó có thể hợp pháp có thể bằng một trong hai dòng đó. – Stewart

+0

Thứ tự của a? b: c được đảm bảo. –

+1

Tôi có thể bị nhầm lẫn, nhưng không phải là '?:' Một trong những nhà khai thác bảo đảm thứ tự đánh giá và có các điểm chuỗi giữa việc đánh giá toán hạng (một số khác là ',', '&&', '||' và có lẽ Một vài thứ khác)? – UncleBens

1

Các toán tử &&, ||?: thực hiện kiểm soát luồng trong biểu thức. ?: hoạt động giống như câu lệnh if-else.

c = b>a?a>b?a++:b++:a++?b++:a--; 

if (b>a) 
    if (a>b) 
     a ++; 
    else 
     b ++; 
else if (a ++) 
    b ++; 
else 
    a --; 

b>a? (
    a>b ? 
     a ++ 
    : 
     b ++ 
) : (a ++ ? 
    b ++ 
: 
    a -- 
) 

Tính kết hợp là cần thiết để có hành vi như if … else if … else.

Đôi khi tôi sử dụng một biểu thức tương tự như của bạn để tự từ điển chuỗi so sánh:

operator<()(arr &l, arr &r) { 
    return l[0] < r[0]? true 
     : r[0] < l[0]? false 
     : l[1] < r[1]? true 
     : r[1] < l[1]? false 
     : l[2] < r[2]; 
} 
+0

mẹo hay. +1 cảm ơn bạn – assembler