Что такое набор назначений через запятую? - PullRequest
12 голосов
/ 04 декабря 2010

я заметил в рутине

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

Почему это работает?

Что это делает?

Ответы [ 3 ]

12 голосов
/ 04 декабря 2010

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

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

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

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

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

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

9 голосов
/ 04 декабря 2010

Из Википедии:

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

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

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

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 голосов
/ 04 декабря 2010

Почему это не должно работать?Он устанавливает %, 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...