2010-12-04 2 views

ответ

9

Оператор запятой - это точка последовательности: каждое разделенное запятой выражение оценивается слева направо. Результат имеет тип и значение правого операнда. Функционально, ваш пример эквивалентен (гораздо более удобной для чтения?):

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

Вот еще один пример того, что стандарт предусматривает оператор запятой (6.5.17):

В вызове функции

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

функция имеет три аргумента, второй из которых имеет значение 5.

8

Материал из Википедии:

В C и C++ языки программирования, оператор запятой (представленный маркером,) представляет собой бинарный оператор, который вычисляет первый операнд и отбрасывает результат, а затем оценивает второй операнд и возвращает это значение (и тип). Оператор запятой имеет самый низкий приоритет любого оператора С и действует как точка последовательности.

Использование токена comma как оператора отличается от его использования в вызовах функций и определениях, объявлениях переменных, перечислениях перечислений и подобных конструкциях, где он действует как разделитель.

В этом примере различное поведение между второй и третьей строками связано с тем, что оператор запятой имеет более низкий приоритет, чем назначение.

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 

Ссылка: http://en.wikipedia.org/wiki/Comma_operator

+0

В 'i = a, b;', что происходит с 'b'? Зачем писать «b» в этом случае? – MichaelChirico

0

Почему он не должен работать? Он устанавливает %, to_hex(*pstr >> 4), to_hex(*pstr & 15) в последовательный блок памяти, адресованный pbuf. Эквивалентный код может быть следующим:

else { 
    *pbuf = '%'; 
    *(pbuf + 1) = to_hex(*pstr >> 4); 
    *(pbuf + 2) = to_hex(*pstr & 15); 
    pbuf += 3; 
} 
Смежные вопросы