Это неопределенное поведение. char str3[] = "daffo";
делает массив достаточно большим, чтобы содержать "dills"
и следующий нулевой терминатор. Затем вы делаете это:
strcat(str3, strcpy(str1, str2)));
, который добавляет к этой строке еще одну строку и вызывает ее переполнение. Мы могли бы предположить, почему x
является 28
, но нет никакого смысла, поскольку нет никаких гарантий относительно его стоимости. Это может быть что-то еще, или программа может аварийно завершить работу, прежде чем она выдаст результат (для меня это повреждение стека, аварийное завершение программы. Это означает, что место в памяти, которое важно для работы потока управления программы, например, стек) указатель, искаженный неопределенным поведением, которое вызывает strcat
).
Кроме того, strcmp
дает возвращаемые значения, определенные как 0
, что-то положительное или что-то отрицательное. Это единственная гарантия, я видел реализации, где он может возвращать что-то вроде 28
, и реализации, где он всегда будет возвращать 0
, 1
или -1
. Поэтому, даже если программа четко определена, на вопрос «почему она возвращает 28
» нельзя ответить без дополнительной информации об используемой реализации strcmp
.