2015-02-04 19 views
7

Có thể kết hợp các biểu thức boolean bằng dấu phẩy. Tôi đã nhìn thấy nó trong một mã và tôi không chắc chắn những gì này giải quyết. Tôi đã viết một số mã mẫu.Đầu ra của "cout << (a, b)" là gì và tại sao?

int BoolStatement(void) 
{ 
    using std::cout; 
    using std::endl; 

    cout << "(0, 0) => " << (0, 0) << endl; 
    cout << "(0, 1) => " << (0, 1) << endl; 
    cout << "(1, 0) => " << (1, 0) << endl; 
    cout << "(1, 1) => " << (1, 1) << endl; 
    cout << "(0, 0) => " << (0, 0) << endl; 
    cout << "(0, 3) => " << (0, 3) << endl; 
    cout << "(5, 0) => " << (5, 0) << endl; 
    cout << "(7, 1) => " << (7, 1) << endl; 

    cout << endl; 
    return 0; 
} 

Kết quả của việc này là:

(0, 0) => 0 
(0, 1) => 1 
(1, 0) => 0 
(1, 1) => 1 
(0, 0) => 0 
(0, 3) => 3 
(5, 0) => 0 
(7, 1) => 1 

Tôi không chắc chắn nếu điều đó chỉ đúng cho hệ thống của tôi và nếu cuộc gọi này thực sự là giống như một sự kết hợp boolean báo cáo.

Đầu ra là gì, có giống nhau trên tất cả các hệ thống không? Tại sao tuyên bố đó có thể và có tài liệu về nó?

+3

Bạn đang kết hợp các biểu thức boolean nào? '0',' 1', '3', v.v ... là số nguyên, không phải là số nguyên. – Barmar

+0

@Barar Tôi ngụ ý việc sử dụng các số nguyên như booleans trong đó 0 là false và 0 là true. Nhưng nhìn vào các câu trả lời bạn nói đúng - điều này không liên quan gì tới các boolean. – Johannes

Trả lời

7

Đầu ra là gì, có giống nhau trên tất cả các hệ thống không?

Đầu ra là khi bạn mô tả: giá trị thứ hai của hai giá trị. Nó được xác định rõ.

Tại sao câu lệnh đó có thể xảy ra?

Bởi vì các nhà điều hành dấu phẩy cho phép bạn đánh giá nhiều hơn một điều trong một biểu thức duy nhất.

có tài liệu trên đó không?

Nó được ghi lại trong tiêu chuẩn C++, [expr.comma]. Trong C++ 11, đó là 5,18.

Nói tóm lại, các nhà điều hành dấu phẩy:

  • đánh giá sự biểu hiện trước dấu phẩy;
  • loại bỏ giá trị đó;
  • đánh giá biểu thức sau dấu phẩy;
  • mang lại giá trị đó làm giá trị biểu thức tổng thể.

Bạn có thể thấy điều đó từ đầu ra của mình: trong mỗi trường hợp, đầu ra là giá trị sau dấu phẩy.

Hoàn toàn vô nghĩa trong trường hợp này; nhưng rất hữu ích nếu biểu thức đầu tiên có các tác dụng phụ mà bạn muốn sắp xếp trước thứ hai, trong một tình huống chỉ cho phép một biểu thức duy nhất. Ví dụ:

for (int i = 0, j = n; i < j; ++i, --j) 

Toán tử cho phép biểu thức cuối cùng thực hiện hai việc, mặc dù bạn chỉ có thể đặt một biểu thức ở đó.

10

Toán tử dấu phẩy trả về phía bên tay phải.

Wikipedia:

Trong C và C++ ngôn ngữ lập trình, các nhà điều hành dấu phẩy (đại diện bởi các dấu hiệu,) là một nhà điều hành nhị phân mà đánh giá toán hạng đầu tiên của mình và loại bỏ kết quả, và sau đó đánh giá các toán hạng thứ hai và trả về giá trị này (và gõ).

4

này là bởi vì nó trả về giá trị cuối cùng của chuỗi biểu hiện của bạn, trong ví dụ của bạn:

cout << "(0, 1) => " << (0, 1) << endl; 
1-------------------------------^ 
    cout << "(1, 0) => " << (1, 0) << endl; 
0-------------------------------^ 
    cout << "(1, 1) => " << (1, 1) << endl; 
1-------------------------------^ 
    cout << "(0, 0) => " << (0, 0) << endl; 
0-------------------------------^ 
    cout << "(0, 3) => " << (0, 3) << endl; 
3-------------------------------^ 
    cout << "(5, 0) => " << (5, 0) << endl; 
0-------------------------------^ 
    cout << "(7, 1) => " << (7, 1) 
1-------------------------------^ 
7

Một biểu hiện trông như thế này

(a, b) 

là một comma expression, giá trị của nó là kết quả của nó là toán hạng tận cùng bên phải, tức là

(a, b, ..., z) 

sẽ tạo ra giá trị là z.

Lưu ý rằng tất cả các biểu thức trong chuỗi được đánh giá, bao gồm các biểu thức này với tác dụng phụ. Hơn nữa, dấu phẩy hoạt động như một điểm chuỗi , có nghĩa là các hiệu ứng phụ được áp dụng trước khi đánh giá toán hạng tiếp theo.

+0

Có lẽ giá trị chỉ ra rằng trong khi chúng trông giống nhau, một biểu thức dấu phẩy và một cuộc gọi chức năng là * không * cùng một điều. Đặc biệt, thứ tự đánh giá các đối số hàm là hoàn toàn không xác định. – BoBTFish

2

Trong C++, toán tử dấu phẩy cung cấp cho trình biên dịch thứ tự đánh giá. Thông thường trình biên dịch là miễn phí để đánh giá bất kỳ biểu hiện theo cách nó thích. Nhưng toán tử dấu phẩy đánh giá toán hạng bên trái của nó trước toán hạng tay phải và trả về giá trị của toán hạng tay phải.

Trong chuỗi các toán hạng được liên kết bởi toán tử dấu phẩy, giá trị trả về là toán hạng tận cùng bên phải.

+0

Chào mừng bạn đến với stackoverflow. – Johannes

+0

Cảm ơn bạn rất nhiều! –

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