#include <stdio.h>
int main(){
char a[] = "bar";
char b[] = "bar";
printf("%d\n", (a==b));
char* x = "bar";
char* y = "bar";
printf("%d\n", (x==y));
}
输出:
0
1
我知道我们不能使用
==
运算符比较C字符数组,因为它比较的是内存位置,但是为什么在第二种情况下它可以工作?#include <stdio.h>
int main(){
char a[] = "bar";
char b[] = "bar";
printf("%d\n", (a==b));
char* x = "bar";
char* y = "bar";
printf("%d\n", (x==y));
}
输出:
0
1
==
运算符比较C字符数组,因为它比较的是内存位置,但是为什么在第二种情况下它可以工作?x
和y
不一定指向相同的地址。 - ad absurdumint main(void) {
char a[] = "bar";
char b[] = "bar";
printf("Arrays Test: %x == %x ? %d\n",&a,&b,(a==b));
char* x = "bar";
char* y = "bar";
printf("Literals Test: %x == %x ? %d, however x == y ? %d\n",&x,&y, (&x==&y),(x==y));
return 0;
}
这个在线运行的示例显示 char 的内存引用不相同。
如果您想查看数组的内容是否相等,您需要手动调用数组中的每个 char 并将其与次级数组进行比较。通过将数组的大小相互比较,您可能可以更快地结束执行。
另一个要点是在这个比较范围内,“指针化”字符或数组没有任何区别。
这是与实现相关的。
在第一种情况下,a
和b
具有单独的存储空间,因此它们的地址不相等。
然而,编译器可能会识别指向的字符串 x
和 y
是相同的,所以它可能通过使它们指向相同的位置来进行优化,因为您无法修改它。但是,由于标准不要求这样做,您不能依赖结果。这是一种可选的优化。编译器仍然可以生成两个相同的字符串,并使 x
和 y
分别指向它们。
x
和y
都包含有效地址;只是实现相关的。 - ad absurdumx
和y
是明确定义的,无论编译器为它们存储一个还是两个字符串,并且指针比较是有效的。没有未定义行为。如果让你放心的话,你可以查看Annex J.2中未定义行为的列表,以确定这不在其中列出 ;) - ad absurdum