пользовательская функция конкатенации - PullRequest
0 голосов
/ 18 февраля 2019

Я изучаю C, и я столкнулся с приведенным ниже кодом, который реализует конкатенацию, но я изо всех сил пытаюсь понять вторую часть, несмотря на пересмотр приоритета указателя / приращения и ассоциативности.

Я выполнил примеры всех различныхкомбинации разыменования и пост / преинкремента, и теперь напоминаем, что преинкремент с разыменованием является ассоциативным справа налево, например * ++ q , где inc будет происходить первым.Страница, на которой я узнал, гласит, что постинкремент с оператором разыменования имеет приращение как более высокий приоритет и далее говорит, что ассоциативность этого примера слева направо.Я не знаю, почему в нем упоминается ассоциативность, поскольку я понимаю, что приоритет рассматривается перед тем, как, например, * p ++ будет увеличиваться до его разыменования.

Приведенный ниже код начинается с рекурсивного вызова себя с пре-инком для dest, чтобы добраться до конца строки назначения, которая обозначается как достижение и разыменование нулевого байта.На этом этапе я теряю трек, потому что я думал бы, что это просто разыменованное dest для разыменованного src, однако он публикует его инкремент, который на основе того, что я узнал, будет увеличиваться в ячейку памяти после разыменования нулевого байта и переходить кприсвойте строку "eeksfor" положению над нулевым байтом в dest.Это не только смущает меня, но и программа продолжает вызывать себя в другом троичном операторе / возвращает 0, казалось бы, без причины.

Спасибо

/* my_strcat(dest, src) copies data of src to dest.  To do so, it first           reaches end of the string dest using recursive calls my_strcat(++dest, src).         Once end of dest is reached, data is copied using  
(*dest++ = *src++)?  my_strcat(dest, src). */
void my_strcat(char *dest, char *src) 
{ 
  (*dest)? my_strcat(++dest, src): (*dest++ = *src++)? my_strcat(dest,   src): 0 ; 
} 

/* driver function to test above function */
int main() 
{ 
  char dest[100] = "geeksfor"; 
  char *src = "geeks"; 
  my_strcat(dest, src); 
  printf(" %s ", dest); 
  getchar(); 
}     

Я запустил программу, и она делает то, чтоэто ожидается сделать.То есть он возвращает строку "geeksforgeeks" так ясно, что я просто чего-то не понимаю

1 Ответ

0 голосов
/ 18 февраля 2019

Хорошо, так что вы понимаете первый рекурсивный бит в порядке (продолжайте увеличивать dst, чтобы найти конец).

Как только вы нашли конец, пришло время начать копирование.Код, который он использует для копирования одного байта: (* dest ++ = * src ++)

Может помочь вашему пониманию расширить этот код до чего-то вроде: * dest = * src;dest + = 1;src + = 1 (потому что они являются пост-инкрементными операторами)

Теперь обычная функция 'copy' будет повторять этот оператор в , тогда как или для цикла ,но поскольку мы умно хвастаемся, мы используем второй троичный оператор и рекурсию.Конечный '0' на самом деле ничего не делает, но он должен присутствовать в качестве "else" части троичного оператора.

Хотя это, возможно, не самая плохая реализация strcat когда-либо написано, это, конечно, сильный соперник.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...