在C语言中比较字面上的空字符串

4
在C语言中,以下代码中的指定是用来做什么的?
if ("" == "")
{
    printf("Empty strings are equal\n");
}

我手头上有一个编译器,告诉我""确实等于""。但这种相等关系是否被保证呢? 编辑:我非常清楚C语言中指针比较和字符串比较的工作原理。我的问题是,对于编译时常量空字符串,C标准是否指定了任何行为?我认为这些字符串不能保证相等,但实际上通常会相等,因为所有的常量空字符串将被内部化到同一地址。但我想知道是否有人可以提供明确的参考资料。

不能保证相等性。这个问题之前在SO上已经讨论过了。 - Sven Marnach
你期望得到不同的东西吗? - karlphillip
1
我的信念是字符串不一定保证相等,但在实践中通常会相等,因为所有的const空字符串都将被集成到同一个地址。但我想知道是否有人能提供明确的参考资料。 - JSBձոգչ
6
C标准规定(6.4.5/6):“字符串字面值是否唯一是未指定的。” - pmg
1
@pmg,这就是我在寻找的。把它变成一个答案,我会接受它。 - JSBձոգչ
显示剩余3条评论
3个回答

12

C标准(6.4.5/6)规定:

[字符串字面量]是否不同是未指定的


5
“保证了吗?我有所怀疑。你并没有比较字符串的内容,而是比较它们的地址,这意味着你依赖编译器不会在同一位置发出两个恰好具有相同内容的字面字符串。这可能有效,但你不应该依赖它(也不清楚它有什么用处)。
编辑:请参阅为什么C语言中“a”!=“a”? - 它回答了基本相同的问题,并获得了近百个赞(并且是由一个编译器执行方式不同的用户编写的)。"

John Zwinck是正确的,你正在赌注编译器的行为。你应该使用strcmp - 除非当然你真的对比较地址感兴趣。 - SolarBear

0

我认为没有任何保证这些将具有相同的地址 - 我怀疑标准会要求这样的行为。为什么您需要依赖于这种可预测性呢?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接