2013-07-22 38 views
22

Tôi gặp sự cố này khi vô tình xóa tên phương thức. Mã này đã đi từTại sao mã C++ này biên dịch? Nó làm gì?

bool bRet = MethodName(pData, pOutFilename); 

để

bool bRet = (pData, pOutFilename); 

nhưng vẫn biên dịch? Mã này làm gì? Nó có nghĩa là gì? Nó có vẻ trở lại đúng, luôn luôn là trường hợp (ngay cả khi pData là null)?

Bất kỳ ý tưởng nào đều được hoan nghênh!

+7

Kiểm tra toán tử dấu phẩy.Giống như 'pData; bool bRet = pOutFilename; ' –

Trả lời

37

nó là "comma operator"

đá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à các loại).

+3

Để sử dụng "loại thực tế", 'if (condition) return fprintf (stderr," Debug message \ n "), FALSE;' Nếu bạn muốn tạm thời thêm một thông báo gỡ lỗi mà không cần thêm dấu ngoặc. –

+0

@RobertFisher thú vị .., nó cũng có thể là 'i = DEBUG_VALUE, j;' –

+0

Điều đáng nói đến là giá trị của 'pOutFilename' được chuyển hoàn toàn thành' bool'. Giả sử 'pOutFilename' là một con trỏ, kết quả là' false' nếu 'pOutFilename' là một con trỏ rỗng,' true' nếu ngược lại. –

17

biểu hiện của bạn bool bRet = (pData, pOutFilename); là một biểu thức hợp lệ, và nó tương đương với biểu thức bool bRet = pOutFilename;

Trong bool bRet = (pData, pOutFilename);, lần đầu tiên biểu pData được đánh giá, thì biểu thức thứ hai pOutFilename được đánh giá, sau đó giá trị của biểu thức thứ hai được gán cho bRet (đây là cách hoạt động của toán tử , từ trái sang phải).

đọc: Comma Operator: ,

Nhà điều hành dấu phẩy ,left-to-right associativity. Hai biểu thức được phân tách bằng dấu phẩy được đánh giá từ trái sang phải. Toán hạng bên trái là luôn được đánh giá và tất cả các tác dụng phụ được hoàn thành trước khi toán hạng đúng được đánh giá.

Để hiểu tầm quan trọng của dấu ngoặc đơn () trong biểu thức của bạn, hãy xem xét ví dụ bên dưới. Quan sát đầu ra trong ví dụ này (Tôi có C chẳng hạn):

int main() { 
    int i = 10, b = 20, c= 30; 
    i = b, c; // i = b 
    printf("%i\n", i); 

    i = (b, c); // i = c 
    printf("%i\n", i); 
} 

đầu ra:

20 
30 

Để hiểu kết quả: look at precedence table, có độ ưu tiên thấp hơn =. Trong biểu thức của bạn, bạn đã ghi đè quyền ưu tiên bằng dấu ngoặc đơn.

+6

Trừ khi' pData' có tác dụng phụ, tôi đoán vậy. – Joey

+0

mà nó có thể chỉ có nếu nó là một vĩ mô –

+0

@StefanoFalasca Nếu 'pData' là uninitialized, có thể giải thích các tiêu chuẩn áp dụng khác nhau có nghĩa là' pData' trong 'pData, pOutFilename' đôi khi hành vi không xác định. Một cái gì đó cũng có thể xảy ra nếu 'pData' là một biến dấu chấm động có chứa một NaN báo hiệu, nhưng tôi không biết nhiều về điều đó. –

4

Mã số , comma operator. Nếu bạn có biểu thức như sau:

i = (a, b);   

b sẽ được lưu trữ thành i.

Vì vậy, trong trường hợp của bạn:

bRet = pOutFilename; 

pOutFilename sẽ được lưu trữ vào bRet.

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