C 如果两个变量的值相同,为什么会显示不相等

C 如果两个变量的值相同,为什么会显示不相等,c,arrays,string,C,Arrays,String,这是我的代码,当我在变量a和b中输入相同的值时,有人能告诉我为什么编译器输出两个都不相等的消息吗 注意:我不想比较字符串,我只需要技术原因 #include<stdio.h> main() { char a[3]="abc",b[3]="abc"; if(a==b) printf("both are equal"); else printf("both are not equal"); } 由于它们的地址不同,请检查输出,如果

这是我的代码,当我在变量a和b中输入相同的值时,有人能告诉我为什么编译器输出两个都不相等的消息吗

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

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

由于它们的地址不同,请检查输出,如果您打算比较它们的值,则最好使用

因为它们的地址不同,请检查输出,如果您打算比较它们的值,则最好使用

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

使用strcmp比较字符串:

strcmpa,b==0表示相等 strcmpa,b!=0表示不等式 strcmpa,对于b之前的a排序,b<0 strcmpa,b 0表示a在b之后排序 strcmpa,对于排序在或等于b之后的a,b>=0
C不做字符串比较。它将比较指向数组开头的两个指针,它们永远不会相等

使用strcmp比较字符串:

strcmpa,b==0表示相等 strcmpa,b!=0表示不等式 strcmpa,对于b之前的a排序,b<0 strcmpa,b 0表示a在b之后排序 strcmpa,对于排序在或等于b之后的a,b>=0
一个数组的名称是它的地址,而不是它的内容,因此,两个不同的数组,无论内容如何,都将“不匹配”。

一个数组的名称是它的地址,而不是它的内容,因此,两个不同的数组,无论内容如何,将“miscompare”。

a和b是数组,除了sizeof和&之外,它们衰减为指向数组第一个元素的指针,并且由于它们占用不同的存储位置,指针将不相等。如果我们看第6.3.2.1节左值、数组和函数指示符,第3段说:

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

这本书也很好地涵盖了这个主题

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

int strcmp( const char *lhs, const char *rhs );
它被描述为:

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

具有以下返回值:

如果lhs小于rhs,则为负值。 ​0​ 如果lhs等于rhs。 如果lhs大于rhs,则为正值。 a和b是数组,除了sizeof和&之外,它们衰减为指向数组第一个元素的指针,由于它们占用不同的存储位置,指针将不相等。如果我们看第6.3.2.1节左值、数组和函数指示符,第3段说:

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

这本书也很好地涵盖了这个主题

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

int strcmp( const char *lhs, const char *rhs );
它被描述为:

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

具有以下返回值:

如果lhs小于rhs,则为负值。 ​0​ 如果lhs等于rhs。 如果lhs大于rhs,则为正值。
如果对象不是真正以NUL结尾的字符串,则使用strncmp会更好。如果对象不是真正以NUL结尾的字符串,则使用strncmp会更好。OT但要存储一个由3个字符组成的字符串,则应声明[4],以便为字符串的空端字符留出空间。其他人回答了这个问题,但要存储一个由3个字符组成的字符串,您应该声明一个[4],以便为字符串的空端留出空间。其他人回答了问题C 2011添加了另一个例外:_Alignof.C 2011添加了另一个例外:_Alignof.a数组的名称命名数组;它不是数组的地址。数组表达式自动转换为指向其第一个元素的指针,除非它是&、sizeof或_Alignof的操作数,或者是用于初始化数组的字符串文字。数组的名称命名数组;它不是数组的地址。数组表达式会自动转换为指向其第一个元素的指针,除非它是&、sizeof或_Alignof的操作数,或者是用于初始化数组的字符串文字。