void main() {
if("a" == "a")
printf("Yes, equal");
else
printf("No, not equal");
}
为什么输出No, not equal
?
答案 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)
这家伙不使用变量。相反,他使用临时文本数组:a
和a
。
void main()
{
if("a" == "a")
printf("Yes, equal");
else
printf("No, not equal");
}
当然不起作用,是你不比较变量 如果你要创建如下变量:
char * text =“a”;
char * text2 =“a”;
然后您可以将text
与text2
进行比较,它应该是 true
也许您不应该忘记使用{
和}
=)
void main() {
if("a" == "a")
{
printf("Yes, equal");
}
else
{
printf("No, not equal");
}
}