1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
  static char s1[]="Good";
  static char s2[20];
  static char s3[20]="Day";

  int i = strcmp(strcat(s3,strcpy(s2,s1)),strcat(s3,"good"));

  printf("%d\n",i);

  return 0;
}

这里的输出是 0,这意味着作为参数传递给的两个字符串strcmp是相等的。但是对于strcmp第一个论点是"DaygoodGood",第二个是"Daygood"......

为什么会这样?

4

4 回答 4

4

无论您如何看待,您都在s3与比较。s3这样做你总是会得到平等的。把它分解 - 改变:

    i=strcmp(strcat(s3,strcpy(s2,s1)),strcat(s3,"good"));

进入:

    char *s4 = strcpy(s2,s1);     // s4 == s2 -> "Good"
    char *s5 = strcat(s3,s4);     // s5 == s3 -> "DayGood"
    char *s6 = strcat(s3,"good"); // s6 == s3 -> "DayGoodgood"

    i = strcmp(s5, s6);           // same as strcmp(s3, s3)

现在它是否真的以这种方式发生,或者如果它是:

    char *s4 = strcpy(s2,s1);     // s4 == s4 -> "Good"
    char *s6 = strcat(s3,"good"); // s6 == s3 -> "Daygood"
    char *s5 = strcat(s3,s4);     // s5 == s3 -> "DaygoodGood"

    i = strcmp(s5, s6);           // same as strcmp(s3, s3)

相反,标准未指定。无论如何,您正在比较相同的字符串,无论连接发生的顺序是什么。您要么比较"DayGoodgood"to"DayGoodgood"要么"DaygoodGood"to "DaygoodGood",但无论哪种方式,您都应该期待0结果。

于 2013-08-30T18:55:57.187 回答
3

结果strcat(t, s)总是等于t。如果你觉得这令人困惑,请记住 C 中的字符串是字符指针,所以我们讨论的是两个指针相等,而不是字符串的(以前的或当前的)内容t

因此,无论当时包含什么,比较的两个字符串都是s3and 。当然他们是平等的。s3s3

于 2013-08-30T18:56:02.360 回答
1

首先,感谢您提出这个问题。它实际上比乍一看要复杂得多。

第一个要理解的概念是“副作用”。也就是说,当参数调用函数时,该函数可能会修改数据,从而修改参数的评估方式。

例如,在评估strcmp(A,B)首先评估哪个参数时,A 还是 B?如果 A 和 B 只是变量,那么没关系。但是,如果它们本身是函数,则可能很重要: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);

希望这可以帮助。

于 2013-08-30T19:16:51.683 回答
1

这是因为 firststrcat返回s3,就像第二个一样。第一次调用将一些内容附加到s3的内容,第二次附加更多,但都返回相同的指针。

于 2013-08-30T18:56:16.077 回答