2015-07-24 17 views
8

Hãy xem xét chức năng nàyĐiều này làm gì? toán tử trong C++ làm gì?

template<class T> inline bool cx(T &a, T b) {return a < b ? a = b, 1 : 0;} 

Bất cứ ai có thể giải thích chính xác điều này đang làm gì? Nó có vẻ khác với định dạng condition ? true : false điển hình.

+5

Nó * là * điều kiện 'điển hình? true: false' – juanchopanza

+0

Thế thì tôi không hiểu mảnh nào là gì, bởi vì điều tôi thấy là 'điều kiện? điều kiện, đúng: false' –

+8

Sau đó, bạn nên hỏi những gì 'a = b, 1' có nghĩa là. Hoặc làm thế nào toàn bộ điều được phân tích cú pháp, có tính đến quyền ưu tiên của nhà điều hành.Nhưng nó là một biểu thức có điều kiện tiêu chuẩn. Mã này dường như được viết để gây nhầm lẫn mặc dù. – juanchopanza

Trả lời

9

Chúng ta có thể làm cho nó rõ ràng hơn như vậy:

return a < b ? (a = b, 1) : 0; 

Các bit trong ngoặc đơn có nghĩa là "gán b-a, sau đó sử dụng 1 như giá trị của chúng tôi".

Comma-separated lists of values trong C và C++ thường có nghĩa là "đánh giá tất cả những điều này, nhưng sử dụng giá trị cuối cùng làm giá trị của biểu thức".

+0

Tôi không biết bạn có thể kết hợp các câu lệnh với dấu phẩy như thế này trong C++ (tôi luôn giả định mọi thứ cần được phân cách bằng dấu chấm phẩy). –

+0

@ArukaJ Đó là những biểu hiện chủ yếu. Câu lệnh là 'return ;'. – juanchopanza

+0

@ArukaJ Bạn không thể kết hợp _statements_ bằng dấu phẩy, chỉ _expressions_. – celticminstrel

0

a < b ? a = b, 1 : 0 được phân tích cú pháp là (a < b) ? (a = b, 1) : 0, toán tử điều kiện bình thường. Khi a < b là true, a = b, 1 được đánh giá bằng cách chỉ định b đến a và sau đó "quay lại" 1. Hiệu ứng ròng của cx(a,b) là do đó gán giá trị lớn hơn cho a và trả lại 1 nếu a thay đổi.

4

Sự kết hợp này hơi phức tạp một chút, bởi vì nó kết hợp một comma operator với biểu thức có điều kiện. Nó phân tích như sau:

  • a < b là điều kiện,
  • a = b, 1 là "khi true" biểu
  • 0 là "khi false" biểu

Kết quả của các nhà điều hành dấu phẩy là thành phần cuối cùng của nó, tức là 1. Mục đích của việc sử dụng toán tử dấu phẩy ở địa điểm đầu tiên là gây ra hiệu ứng phụ của việc gán b đến a.

1

đọc nó như:

if (a < b) 
{ 
    a = b; 
    return (1); 
} 
else 
{ 
    return (0); 
} 
3

Nhà điều hành , chỉ đánh giá tất cả các biểu thức, trái sang phải, và để đánh giá giá trị của biểu thức ngoài cùng bên phải.

Mã của bạn cũng giống như ...

if (a < b) 
{ 
    a = b; 
    return 1; 
} 
else 
{ 
    return 0; 
} 
+0

... và sẽ không biên dịch. –

+1

@juanchopanza Mã này tương đương với 'return a QuestionC

+0

@QuestionC Đủ công bằng. – juanchopanza

3

Bạn có thể thực hiện một vài biểu hiện sử dụng ,

Trong trường hợp này nếu một < b, sau đó gán b cho a và trở về 1. Theo C++ ngữ pháp:

conditional-expression: 
    logical-or-expression 
| logical-or-expression ? expression : assignment-expression 

nơi

expression: 
    assignment-expression 
| expression , assignment-expression 

assignment-expression: 
    conditional-expression 
| logical-or-expression assignment-operator initializer-clause 
| throw-expression 
Các vấn đề liên quan