я заметил в рутинеЧто такое набор заданий, разделенный запятой?
else
*pbuf++ = '%', *pbuf++ = to_hex(*pstr >> 4), *pbuf++ = to_hex(*pstr & 15);
Почему это работает?
Что делать?
я заметил в рутинеЧто такое набор заданий, разделенный запятой?
else
*pbuf++ = '%', *pbuf++ = to_hex(*pstr >> 4), *pbuf++ = to_hex(*pstr & 15);
Почему это работает?
Что делать?
Оператор запятой - это точка последовательности: каждое разделенное запятой выражение оценивается слева направо. Результат имеет тип и значение правого операнда. Функционально, ваш пример эквивалентен (гораздо более удобной для чтения?):
else
{
*pbuf++ = '%';
*pbuf++ = to_hex(*pstr >> 4);
*pbuf++ = to_hex(*pstr & 15);
}
Вот еще один пример того, что стандарт предусматривает оператор запятой (6.5.17):
В вызове функции
f(a, (t=3, t+2), c)
функция имеет три аргумента, второй из которых имеет значение 5.
Материал из Википедии:
В 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
Почему он не должен работать? Он устанавливает %
, 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;
}
В 'i = a, b;', что происходит с 'b'? Зачем писать «b» в этом случае? – MichaelChirico