Дальнейшее недопонимание возникло видимо из-за того что либо я плохо понял ваши пространные разъяснения, либо вы их написали не достаточно понятно, скорее всего оба фактора сыграли.
Вы же видите по вашей же ссылке, что компилятор достаточно умный, что бы не выполнять сложение каждый раз - сложение происходит один раз:
Вы ошибаетесь на счет *t++ - оно работает именно так как задумывается, а именно - возвращает значение *t, затем увеличивает на 1 адрес в t.
Но вы правы в том, что return будет возвращать не верное значение из-за *t++, я не обратил на это внимания, согласен.
Компилятор первую версию превращает во вторую
Меньшее количество инструкций не всегда говорит о том, что код лучше.
P.S. чисто по приколу, давайте попробуйте сделать это с помощью strncpy и strncat, посмотрим что у вас из этого получится:))) - вы и вправду думаете что они это безопасные и лучшие версии strcpy и strcat?) ну-ну:))
ПС. мои функции чисто идеологически ближе к strlcpy и strlcat