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

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

为什么输出No, not equal

你比较的是不同string的两个存储地址,它们存储在不同的位置。 这样做基本上是这样的:

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

使用下面的代码来比较两个string值:

 #include <string.h> ... if(strcmp("a", "a") == 0) { // Equal } 

另外, "a" == "a"可能确实会返回true,这取决于您的编译器,它可能在编译时将相等的string合并为一个以节省空间。

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

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

我对晚会有点迟,但我仍然要回答; 在技​​术上相同的位,但从一个不同的angular度(C说法下面):

在C中,expression式"a"表示一个string字面值 ,它是一个静态无名数组const char ,长度为2 – 数组由字符'a''\0' – 终止空字符表示结束的string。

然而,在C中,就像你不能通过值传递数组到函数一样 – 或者给它们赋值( 在初始化之后 ) – 数组没有重载运算符== ,所以不可能直接比较它们。 考虑

 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语言中,在几乎所有的情况下(包括这个),数组衰减成指针(指向数组的第一个元素),并且比较指针是否等于你期望的。 如此有效地,当这样做

 "a" == "a" 

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

正如其他人指出的那样,为了比较“cstring”(即以空字符结尾的string),可以使用标准头文件string.h的便捷函数strcmp 。 对于相等的string,函数的返回值为0 ; 将返回值显式比较为0而不是使用运算符“!”,这是很好的做法

 strcmp(str1, str2) == 0 // instead of !strcmp(str1, str2) 

根据C99(第6.4.5 / 6节)

string文字

没有说明这些数组是否是不同的,只要它们的元素具有适当的值

所以在这种情况下,不清楚"a"是否有区别。 一个优化的编译器可以在只读位置保留一个"a" ,并且这两个引用都可以引用它。

在这里查看gcc的输出

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

使用strcmp()而不是==

简单地说,C没有内置的string比较运算符。 它不能以这种方式比较string。

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

在C中,双引号中的文本string返回一个指向string的指针。 你的例子是比较指针,显然你的两个版本的string存在于不同的地址。

但是,这并不是像你所期望的那样比较string本身。

指针。

第一个"a"是指向以空字符结尾的ASCIIstring的指针。

第二个"a"是另一个以空字符结尾的ASCIIstring的指针。

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

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

一些编译器具有“合并string”选项,您可以使用它来强制所有常量string具有相同的地址。 如果你使用这个, "a" == "a"将是true

这个问题为所有的起始者提供了很好的解释。
让我也为它做出贡献…..

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

现在如果你想要你的前卫。 然后打印“是的”

要么使用

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

要么
不要使用“a”作为string,使用它们作为字符….

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

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

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

 if('a' == 'a') 

而C不能支持string比较,比如"abc" == "abc"

这是用strcmp("abc","abc")

这家伙不使用variables。 相反,他暂时使用文本数组: aa 。 之所以

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

当然不行,是你不比较变数。
如果你想创build像这样的variables:

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

那么你可以比较text2text2 ,它应该是真实的

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

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