Код: (while *s++ = *t++);
примерно эквивалентен:
while (*s = *t) {
++s;
++t;
}
Второй точно такой же - дополнительные парены ничего не меняют (в данном случае). Чтобы парни могли что-либо делать, они должны быть такими: while ((*s)++ = (*t)++);
. Это будет примерно так же, как и в третьем примере (см. Параграф ниже).
Последний пример: while(++*s = ++*t);
совершенно другой. Поскольку разыменование (*
) ближе к операнду, это разыменовывает операнд и увеличивает результат разыменования, что означает, что он увеличивает то, на что указывает указатель AT, вместо того, чтобы увеличивать сам указатель. В результате это будет копировать первый символ, затем увеличивать его, затем проверять, был ли этот символ ненулевым, и продолжать то же самое, пока он не стал нулевым. Результатом будет то, что и источник, и пункт назначения станут пустыми строками (поскольку первый символ обоих теперь будет нулем, что используется для завершения строк).