如果两个var具有相同的值,为什么它将显示不相等

时间:2013-11-21 02:37:22

标签: c arrays string

这是我的代码,任何人都可以告诉我为什么当我在变量ab中放入相同的值时,编译器会打印“两者都不相等”的消息。

(注意:我不想比较字符串,我只需要技术原因)。

#include<stdio.h>
main()
{
    char a[3]="abc",b[3]="abc";
    if(a==b)
        printf("both are equal");
    else
        printf("both are not equal");
}

4 个答案:

答案 0 :(得分:5)

C不进行字符串比较。它将比较指向数组开头的两个指针,它们永远不会相等。

使用strcmp()比较字符串:

  • strcmp(a, b) == 0求平等
  • strcmp(a, b) != 0 for notquality
  • strcmp(a, b) < 0 之前对a排序的
  • b {li> strcmp(a, b) <= 0之前a排序等于b
  • {li> strcmp(a, b) > 0 ab排序 {li> strcmp(a, b) >= 0 a之后或等于b 的排序

答案 1 :(得分:1)

ab是数组,除 sizeof &外,它们会衰减到指向数组第一个元素的指针,因为它们占据了不同的存储位置指针不相等。如果我们查看C99 draft standard部分6.3.2.1 Lvalues,数组和函数指示符 3 表示(强调我的 ):

  

除非它是sizeof运算符或一元&amp;的操作数。运营商,或者是   用于初始化数组的字符串文字,具有类型''数组类型'的表达式   转换为类型为''指向类型'的指针的表达式,指向的初始元素   数组对象并且不是左值。如果数组对象有寄存器存储类,则   行为未定义。

C FAQ question 6.3也很好地涵盖了这个主题。

比较C样式字符串的正确方法是使用链接文档中的strcmp

int strcmp( const char *lhs, const char *rhs );

,它被描述为:

  

比较两个以空字符结尾的字节字符串。比较是按字典顺序进行的。

具有以下返回值:

  • 如果lhs小于rhs,则为负值。
  • 0如果lhs等于rhs。
  • 如果lhs大于rhs,则为正值。

答案 2 :(得分:0)

因为他们的地址不同(请查看输出here),如果您打算比较他们的值,最好使用strcmp(a,b)

答案 3 :(得分:0)

数组的名称是它的地址,而不是它的内容,因此,两个不同的数组,无论内容如何,​​都会“误比较”。