2010-12-04 26 views

Trả lời

9

Toán tử dấu phẩy là một điểm chuỗi: mỗi biểu thức được tách nhau bằng dấu phẩy được đánh giá từ trái sang phải. Kết quả có kiểu và giá trị của toán hạng bên phải. Về mặt chức năng, ví dụ của bạn là tương đương với (các nhiều hơn nữa có thể đọc được?):

else 
{ 
    *pbuf++ = '%'; 
    *pbuf++ = to_hex(*pstr >> 4); 
    *pbuf++ = to_hex(*pstr & 15); 
} 

Dưới đây là một ví dụ khác mà tiêu chuẩn cung cấp cho các nhà điều hành dấu phẩy (6.5.17):

Trong cuộc gọi chức năng

f(a, (t=3, t+2), c) 

hàm có ba đối số, thứ hai trong số đó có giá trị 5.

8

Từ Wikipedia:

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

Việc sử dụng dấu phẩy làm toán tử khác với việc sử dụng dấu hàm và định nghĩa, khai báo biến, khai báo enum và cấu trúc tương tự, nơi nó hoạt động như dấu tách.

Trong ví dụ này, hành vi khác nhau giữa dòng thứ hai và thứ ba là do toán tử dấu phẩy có mức ưu tiên thấp hơn so với gán.

int a=1, b=2, c=3, i; // comma acts as separator in this line, not as an operator 
i = (a, b);    // stores b into i        ... a=1, b=2, c=3, i=2 
i = a, b;    // stores a into i. Equivalent to (i = a), b;  ... a=1, b=2, c=3, i=1 
i = (a += 2, a + b); // increases a by 2, then stores a+b = 3+2 into i ... a=3, b=2, c=3, i=5 
i = a += 2, a + b;  // increases a by 2, then stores a = 5 into i  ... a=5, b=2, c=3, i=5 
i = a, b, c;   // stores a into i        ... a=5, b=2, c=3, i=5 
i = (a, b, c);   // stores c into i        ... a=5, b=2, c=3, i=3 

Link: http://en.wikipedia.org/wiki/Comma_operator

+0

Trong 'i = a, b;', điều gì đang xảy ra với 'b'? Tại sao một người viết 'b' trong trường hợp này? – MichaelChirico

0

Tại sao nó không nên làm việc? Nó đặt %, to_hex(*pstr >> 4), to_hex(*pstr & 15) vào khối bộ nhớ tuần tự được giải quyết bởi pbuf. Mã tương đương có thể như sau:

else { 
    *pbuf = '%'; 
    *(pbuf + 1) = to_hex(*pstr >> 4); 
    *(pbuf + 2) = to_hex(*pstr & 15); 
    pbuf += 3; 
} 
Các vấn đề liên quan