Прежде всего, спасибо за этот вопрос. Это на самом деле сложнее, чем можно было бы поверить на первый взгляд.
Первым понятием является «побочные эффекты». То есть, когда параметр вызывает функцию, тогда эта функция может изменять данные так, чтобы как оценивался параметр.
Например, при оценке strcmp(A,B)
этот параметр сначала оценивается, A или B? Если A и B являются просто переменными, то это делает NOT вопрос. Однако, если они сами являются функциями, это может иметь значение: strcmp(A(1), B(2))
может быть, может быть, иметь значение, если сначала оценивается A (1), или B(2)
.
Давайте посмотрим конкретно на ваш код:
strcmp(strcat(s3,strcpy(s2,s1)),strcat(s3,"good"));
Он может быть оценен внутренне компилятором как:
A)
strcat(s3,strcpy(s2,s1)); //s3 = "DayGood'
strcat(s3,"good"); //s3 = "DayGoodgood"
strcmp(s3, s3);
или она может быть оценена как:
B)
strcat(s3,"good"); // s3 = "Daygood"
strcat(s3,strcpy(s2,s1)); // s3 = "DaygoodGood"
strcmp(s3, s3);
Так , s3 имеет два возможных значения, в зависимости от того, как компилятор оценивает параметры, а разница свидетельствует о " побочные эффекты".
Наконец, чтобы увидеть, как ваш компилятор работает, измените PRINTF заявление:
printf("\n%d, %s\n\n", i, s3);
Надеется, что это помогает.
@WhozCraig, вы правы, но это не имеет никакого отношения к причине, по которой он не получает ожидаемого результата. – nickie
strcat (s3, «good») ..... справа налево ассоциативный – user2712068