void main() {
if("a" == "a")
printf("Yes, equal");
else
printf("No, not equal");
}
为什么输出No, not equal
?
void main() {
if("a" == "a")
printf("Yes, equal");
else
printf("No, not equal");
}
为什么输出No, not equal
?
Answers:
您正在比较的是不同字符串的两个内存地址,它们存储在不同的位置。这样做基本上是这样的:
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
-fmerge-constants
,-fno-merge-constants
可以启用/禁用跨翻译单元的字符串和浮点常量合并,尽管在某些GCC上,无论使用哪种选项,似乎始终启用了常量合并。
int
类型。:-)而且,指针不必一定是数字值。
int
也是数字,不是吗?但是我以为char是Byte。Int是4个字节。指针本身也是整数。它们包含一堆数据的地址(实际上不必是数字的数据)。
'a' == 'A' // not true
... MySQL希望有所不同。
我参加聚会有点晚了,但是我还是要回答。技术上相同的比特,但是从一个位不同的角度(C用语如下):
在C中,表达式"a"
表示字符串文字,它是的静态未命名数组const char
,长度为2-数组由字符组成,'a'
并且'\0'
-终止的空字符表示字符串的结尾。
但是,在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标准,比较可能会得出true或false(即1或0)"a"
-s实际上可能表示相同的数组或两个完全不相关的数组。用技术术语来说,结果值是不确定的,这意味着可以进行比较(即,它不是未定义的行为或语法错误),但是其中一个值都是有效的,并且不需要实现(您的编译器)来记录实际情况。
正如其他人指出的那样,要比较“ c字符串”(即以空字符结尾的字符串),可以使用strcmp
标准头文件中的便捷函数string.h
。该函数的返回值为0
相等的字符串。最好明确地将返回值与进行比较,0
而不要使用运算符“!”,即
strcmp(str1, str2) == 0 // instead of !strcmp(str1, str2)
因为它们是2个单独const char*
的指针,所以没有实际值。你说的是这样0x019181217 == 0x0089178216
,当然返回否
使用strcmp()
代替==
指针。
第一个"a"
是指向以空值结尾的ASCII字符串的指针。
第二个"a"
是指向另一个以空值终止的ASCII字符串的指针。
如果您使用的是32位编译器,我会期望的"a"=="a"-4
。我只是用tcc / Win32尝试过,然后得到了"a"=="a"-2
。那好吧...
strcmp
一次运行几个字节。有些编译器会这样做,有些则不会,有些只对长度超过某些最小值的字符串进行处理……
这个问题为所有初学者设置了很好的解释路径。...
让我也为它做贡献.....
正如以上每个人所解释的,为什么会得到这样的输出。
现在,如果您想要您的编。要打印“是等于”,则
要么使用
if(strcmp("a", "a") == 0)
{
}
或
不要将“ a”用作字符串,而应将它们用作字符。
if('a'=='a')
{
printf ("yes Equal");
}
在C字符中是1个字节的短整数……。
'a'
实际上是整数。
如果字符之间的比较总是用单引号引起来,例如
if('a' == 'a')
和C不能像这样支持字符串比较 "abc" == "abc"
完成了 strcmp("abc","abc")
这个家伙不使用变量。相反,他使用了临时文本数组:a
和a
。之所以
void main()
{
if("a" == "a")
printf("Yes, equal");
else
printf("No, not equal");
}
当然行不通,是您不比较变量。
如果要创建如下变量:
char * text =“ a”;
char * text2 =“ a”;
那么你可以比较text
使用text2
,它应该是真实的
也许您不应该忘记使用{
和}
=)
void main() {
if("a" == "a")
{
printf("Yes, equal");
}
else
{
printf("No, not equal");
}
}
void main
??? Ew ...