2012-11-03 66 views
6

thể trùng lặp:
why does 3,758,096,384 << 1 gives 768C++ 'Int x = (anyInt1, anyInt2);' nghĩa là?

Hôm nay tôi phát hiện ra rằng đoạn mã sau biên dịch với gcc:

#include <iostream> 

int main() 
{ 
    int x = (23,34); 

    std::cout << x << std::endl; // prints 34 

    return 0; 
} 

Tại sao điều này biên dịch? Ý nghĩa của (..., ...) là gì?

+1

Tất nhiên ý nghĩa thực sự là một số ass thông minh sử dụng toán tử dấu phẩy, rất hiếm khi được chứng minh. – Yakk

Trả lời

8

Trong C++, , là một toán tử, và do đó (23,34) là một biểu thức giống như (23+34) là một biểu thức. Trước đây, , là một toán tử, trong khi sau, + là toán tử.

Vì vậy, biểu thức (23,34) đánh giá toán hạng gần nhất bên phải là 34 đó là lý do mã của bạn xuất ra 34.

Tôi cũng muốn đề cập đến rằng , không phải là một nhà điều hành trong một cuộc gọi chức năng:

int m = max(a,b); 

Đây , đóng vai trò một tách các đối số. Nó không hoạt động như nhà điều hành. Vì vậy, bạn vượt qua hai đối số cho hàm.

Tuy nhiên,

int m = max((a,b), c); 

đây đầu tiên , là một nhà điều hành, và thứ hai , là một dấu phân cách. Vì vậy, bạn vẫn chuyển hai đối số cho hàm, chứ không phải ba đối số và tương đương với hàm này:

int m = max(b, c); //as (a,b) evaluates to b 

Hy vọng điều đó sẽ hữu ích. :-)

+3

Lưu ý nhỏ về vai trò ngoặc trong ví dụ này sẽ hữu ích vì toán tử có ưu tiên thấp hơn sau đó = toán tử. int x = 23,34; sẽ không biên dịch chút nào. – Tomek

+0

@Tomek: Tốt. Cảm ơn. Hy vọng các độc giả cũng sẽ thấy bình luận của bạn. – Nawaz

+1

Điều này cũng đúng đối với C. –

14

Trong biểu thức, toán tử dấu phẩy sẽ đánh giá tất cả toán hạng của nó và trả về toán hạng cuối cùng. Đó là lý do tại sao trong ví dụ của bạn, x bằng 34.

+0

Và dấu ngoặc đơn cũng giống như khi được sử dụng trong ví dụ, ví dụ như các câu lệnh nhóm. – mrbrdo

+0

Ah, vâng. Tôi quên rằng có toán tử dấu phẩy trong C++. thx – pwks

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