为什么C中的“a”!=“a”?

时间:2011-01-30 15:19:19

标签: c string

void main() {
    if("a" == "a")
      printf("Yes, equal");  
    else
      printf("No, not equal");
}

为什么输出No, not equal

11 个答案:

答案 0 :(得分:209)

您要比较的是不同字符串的两个内存地址,它们存储在不同的位置。这样做基本上是这样的:

if(0x00403064 == 0x002D316A) // Two memory locations
{
    printf("Yes, equal");
}

使用以下代码比较两个字符串值:

#include <string.h>

...

if(strcmp("a", "a") == 0)
{
    // Equal
}

此外,"a" == "a"可能确实返回true,具体取决于您的编译器,它可以在编译时将相等的字符串组合成一个以节省空间。

当您比较两个字符值(不是指针)时,它是一个数字比较。例如:

'a' == 'a' // always true

答案 1 :(得分:52)

我参加聚会有点晚了,但无论如何我都会回答。技术上相同的位,但从不同的角度来看(C语言如下):

在C中,表达式"a"表示字符串文字,它是const char的静态未命名数组,长度为2 - 数组由字符组成{ {1}}和'a' - 终止空字符表示字符串的结尾。

但是,在C中,您无法通过值将数组传递给函数 - 或者为它们赋值(初始化之后) - 数组没有重载的运算符'\0',所以不可能直接比较它们。考虑

==

如果int a1[] = {1, 2, 3}; int a2[] = {3, 4, 5}; a1 == a2 // is this meaningful? Yes and no; it *does* compare the arrays for // "identity", but not for their values. In this case the result // is always false, because the arrays (a1 and a2) are distinct objects 没有比较数组,它实际上做了什么呢?在C中,在几乎所有的上下文中 - 包括这一个 - 数组衰减成指针(指向数组的第一个元素) - 并且比较指针的相等性就是你所期望的。这样做有效,

==

您实际上比较两个未命名数组中的第一个字符的地址。根据C标准,比较可以产生真或假(即1或0) - "a" == "a" s实际上可以表示相同的阵列或两个完全不相关的阵列。在技​​术术语中,结果值是未指定,这意味着允许比较(即,它不是未定义的行为或语法错误),但是这两个值都是有效的并且是实现的(您的编译器)不需要记录实际发生的情况。

正如其他人所指出的,为了比较“c字符串”(即以空字符结尾的字符串),您可以使用标准头文件"a"中的便捷函数strcmp。对于相等的字符串,该函数的返回值为string.h;明确地将返回值与0进行比较而不是使用运算符“!”,即

,这被认为是一种好的做法。
0

答案 2 :(得分:47)

根据C99(第6.4.5 / 6节)

  

字符串文字

     

如果这些数组的元素具有适当的值,则未指定这些数组是否相同。

因此,在这种情况下,未指明两个"a"是否都是不同的。优化的编译器可以在只读位置保留单个"a",并且两个引用都可以引用它。

查看gcc here

上的输出

答案 3 :(得分:19)

因为它们是2个独立的const char*,指针,没有实际值。 你说的是0x019181217 == 0x0089178216,当然会返回NO

使用strcmp()代替==

答案 4 :(得分:9)

简单地说,C没有内置的字符串比较运算符。它无法以这种方式比较字符串。

相反,使用标准库例程(如strcmp())或通过编写代码来循环字符串中的每个字符来比较字符串。

在C中,双引号中的文本字符串返回指向字符串的指针。您的示例是比较指针,显然您的两个版本的字符串存在于不同的地址。

但它并没有像你期望的那样比较字符串本身。

答案 5 :(得分:3)

指针。

第一个"a"是指向以null结尾的ASCII字符串的指针。

第二个"a"是指向另一个以null结尾的ASCII字符串的指针。

如果您使用的是32位编译器,我希望"a"=="a"-4。 我刚刚尝试使用tcc / Win32,我得到"a"=="a"-2。 哦,好吧......

答案 6 :(得分:1)

这个问题为所有的乞讨者提供了很好的解释...... 让我也为此做出贡献.....

正如上面所解释的那样,为什么你得到这样的输出。

现在如果你想要你的编程。打印“是等于”然后

使用

if(strcmp("a", "a") == 0)
{

}


  不要将“a”用作字符串,将它们用作字符....

if('a'=='a')  
{  
printf ("yes Equal");  
}  

中的C字符是1字节的短整数.......

答案 7 :(得分:1)

您正在比较两个内存地址,因此结果并不总是如此。你试过if('a' == 'a'){...}吗?

答案 8 :(得分:0)

某些编译器具有“合并字符串”选项,您可以使用该选项强制所有常量字符串具有相同的地址。如果您愿意,"a" == "a"将为true

答案 9 :(得分:0)

如果字符之间的比较总是在单引号中,例如

if('a' == 'a')

和C不支持"abc" == "abc"

等字符串比较

完成了strcmp("abc","abc")

答案 10 :(得分:-5)

这家伙不使用变量。相反,他使用临时文本数组:aa

之所以如此
void main() 
{
    if("a" == "a")
      printf("Yes, equal");  
    else
      printf("No, not equal");
}

当然不起作用,是你不比较变量 如果你要创建如下变量:

  

char * text =“a”;
  char * text2 =“a”;

然后您可以将texttext2进行比较,它应该是 true

也许您不应该忘记使用{} =)

void main() {
    if("a" == "a")
    {
      printf("Yes, equal");
    }
    else
    {
      printf("No, not equal");
    }
}