Народ, снимите с ручника!
Не могу догнать, почему нельзя делать вот так (помечено _XXX_):char *my_strcat(char *dest, const char *src)
{
char *tmp = dest;while (*dest++ != '\0') /* _XXX_ */
;
}
while ((*dest++ = *src++) != '\0')
;
return tmp;
}В таком виде ф-ция неправильно работает. Если же поменять на:
while (*dest != '\0')
dest++;
то все ОК! GDB-ой ходил, вроде как в обоих случаях все одинаково, но в результате - нет!Спасибо!
В первом случае указатель останавливается за нулевым байтом (успевает увеличиться перед сравнением). Во втором случае на нулевом байте.
если я правильно понимаю, то дело тут в:
оператор ++ имеет больший приоритет чем *, поэтому когда дело доходит, до разименовывания (*), сначала выполняется ++ и указатель успевает увеличиться.
>если я правильно понимаю, то дело тут в:
>оператор ++ имеет больший приоритет чем *, поэтому когда дело доходит, до
>разименовывания (*), сначала выполняется ++ и указатель успевает увеличиться.Ну, типа того, только приоритет тут не причём.
Там (в первом варианте) дело в том, что и инкремент, и разимновывание выполняются до проверки (=во время вычисления) условия цикла, перед выходом из него, в частности. Т.о. когда условие в первом варианте выпоняется ("под указателем" NUL), указатель уже сдвинулся этим самым инкрементом ("первый" NUL попал в вых.строку).
О чём и ответили чуть выше.