你必须的very这里要小心,因为您正在查看的某些案例与其他案例并不完全相同。
在你的第一个例子中:
char a[] = "aaa";
char b[] = "aaa";
if (a == b)
你正在创建两个arrayschar,每个都从字符串文字初始化。然后,您尝试将这些数组进行相互比较。在大多数情况下(包括这种情况),数组名称的计算结果为该数组中第一个元素的地址。所以你实际上是在比较两个数组的地址。这些不可能相同,因此比较保证会产生结果false
.
在你的第二个例子中:if ("aaa" == "aaa")
,您正在比较字符串文字他们自己,而不是从字符串文字初始化的数组。
标准不保证此结果。该标准允许(但不要求)将相同的字符串文字合并在一起。然而,再次强调,您真正比较的不是文字的内容,而是它们存储的地址。如果编译器合并字符串文字,使它们位于相同的地址,这将产生true
。如果它让它们分开,它会产生false
.
In your auto
case:
auto a = "whuiwhqohqweihqweohi";
auto b = "whuiwhqohqweihqweohi";
你的情况也差不多——a
and b
两者最终都是指向 char 的指针,保存字符串文字的地址。如果编译器合并这些文字,它们将都指向相同的地址,因此它们比较相等。如果编译器不将它们合并在一起,每个都将有自己的地址,并且它们将比较不相等。
这里最重要的一点是,这些都没有比较contents字符串的所有内容,仅是它们存储的地址。内容仅在两个字符串文字具有(或至少以相同内容结尾)时才能合并的程度进行计算。
就“至少以”结尾而言,我指的是编译器如果有类似的内容:"wing"
在一个地方并且"swing"
在另一个例子中,编译器可以自由地将两者合并,因此代码如下:
auto a = "wing";
auto b = "swing";
...编译器可以存储swing
放在一处,并初始化a
指向该存储文字的第二个字符。