为什么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。 相反,他暂时使用文本数组: a
和a
。 之所以
void main() { if("a" == "a") printf("Yes, equal"); else printf("No, not equal"); }
当然不行,是你不比较变数。
如果你想创build像这样的variables:
char * text =“a”;
char * text2 =“a”;
那么你可以比较text2
和text2
,它应该是真实的
也许你不应该忘记使用{
和}
=)
void main() { if("a" == "a") { printf("Yes, equal"); } else { printf("No, not equal"); } }