【发布时间】:2021-05-08 03:19:08
【问题描述】:
注意:我知道我可以通过使用 strcmp() 来做这些事情,但我只是在尝试等于 == 运算符。
代码 1:
#include<stdio.h>
int main()
{
char s1[]="bonaparte",s2[]="bonaparte";
if(s1==s2)
{
printf("True");
}
else
{
printf("Flase");
}
}
输出:
False
代码 2:
#include<stdio.h>
int main()
{
char s[]="bonaparte";
if(s=="bonaparte")
{
printf("True");
}
else
{
printf("Flase");
}
}
输出:
False
代码 3:
#include<stdio.h>
int main()
{
if("bonaparte"=="bonaparte")
{
printf("True");
}
else
{
printf("Flase");
}
}
输出:
True
所以,在#1 中,我们比较了s1 和s2 的基地址,显然它们会有所不同,因此输出为“False”。
在#2 中,我们比较了s 的基地址和常量字符串"bonaparte" 的基地址,显然它又会有所不同,因此输出为“False”。
然而,在#3 中,我们比较了一个常量字符串"bonaparte" 和另一个常量字符串"bonaparte" 的基地址。我认为字符串名称是相同的,但它们会在内存中获得不同的位置,因此,当我们尝试比较它们的基地址时,它们应该是不同的。但输出与上述矛盾(我认为)。
那么在第 3rd 案例中究竟发生了什么?
【问题讨论】:
-
but they will get different location in memory为什么编译器会将此(只读)数据存储两次?会浪费空间。 -
字符串文字可能只有一个副本,但您不能指望它。
strcmp和朋友的存在是有原因的。