相等运算符运算规则,解释[]==[],[]==![],{}=={},{}==!{}

相等运算符的运算规则如下: 

 1、如果两个值类型相同,进行 === 比较。

(ps:[]==[] ,{} == {}类型相同,进行===比较,所在地址不同,所以返回false)

 2、如果两个值类型不同,他们可能相等。

根据下面规则进行类型转换再比较: 

(1)如果一个是null、一个是undefined,那么[相等]。 

(2)如果任一值是字符串,另一个值是数值,在比较相等性之前先将字符串转换为数值;即调用Number()函数。 

(3)如果任一值是布尔值,在比较相等性之前先将其转换为数值,即是调用Number()函数。 

(4)如果一个是对象,另一个是数值或字符串,把对象转换成基础类型的值再比较。对象转换成基础类型,利用它的toString或者valueOf方法。 js核心内置类,会尝试valueOf先于toString;但Date利用的是toString转换。

(ps: [] == ![]  !优于 ==  所以转换为 [] == false --> [] == 0 --> ''==0  所以返回true)

(ps: {} == !{} --> {} == false --> {} == 0 --> [object Object] == 0 所以返回false)

补充:

不同类型对象的valueOf()方法的返回值
对象返回值
Array返回数组对象本身。
Boolean布尔值。
Date存储的时间是从 1970 年 1 月 1 日午夜开始计的毫秒数 UTC。
Function函数本身。
Number数字值。
Object对象本身。这是默认情况。
String字符串值。
Math 和 Error 对象没有 valueOf 方法。
所以 [] 和 {} 的valueOf方法都返回对象本身,所以用toString() 方法




转载于:https://juejin.im/post/5d0a06516fb9a07eee5ed222

<think>好的,我需要回答用户关于C语言中'!='运算符的用法。首先,我要确保自己对这个运算符的理解正确。'!='是不等于运算符,用于比较两个操作数的值是否不相等。如果它们不相等,表达式的结果为真(1),否则为假(0)。这个运算符属于关系运算符,而关系运算符的优先级在C语言中是什么样的呢?根据引用[1]中的信息,关系运算符的优先级高于位运算符、逻辑运算符、三目运算符和赋值运算符,但低于算术运算符和移位运算符。这可能会影响表达式的计算顺序,需要注意括号的使用。 接下来,我应该说明'!='的基本语法结构,即`操作数1 != 操作数2`,并强调它通常用在条件语句(如if、while)中。举个例子,比如比较两个整数是否不相等,或者在循环中判断循环条件是否满足。例如,`if (a != 0)`或者`while (x != y)`这样的用法。 然后,用户可能需要知道在使用'!='时需要注意哪些问题。比如,操作数的类型是否兼容,不同类型的比较是否会导致隐式转换,以及指针比较的情况。比如,不能用'!='直接比较两个不同结构体的变量,但可以比较指针是否指向不同的地址。此外,浮点数的精度问题也需要特别注意,因为直接比较浮点数可能会因为精度误差导致意外结果,这时候应该用范围判断代替直接的不等于比较。 还有,用户可能关心'!='和其他运算符的优先级关系。例如,在复杂的表达式中,是否需要使用括号来明确运算顺序。根据引用[1],关系运算符的优先级高于逻辑运算符,但低于算术运算符。比如,在表达式`a + 5 != b * 3`中,算术运算先执行,然后才进行不等于比较。而如果结合逻辑运算符,比如`a != b && c != d`,因为关系运算符优先级高于逻辑运算符,所以不需要额外括号。 另外,引用[3]提到了赋值运算符,虽然和'!='没有直接关联,但可以提醒用户注意不要混淆赋值运算符'='和比较运算符'=='或'!=',这是常见的错误来源。例如,将`if (a != 0)`写成`if (a = 0)`会导致赋值而非比较,这可能引发逻辑错误。 最后,我需要考虑生成的相关问题,可能涉及其他关系运算符运算符优先级的具体例子,或者'!='在特定场景下的应用,如循环控制或条件判断中的陷阱。确保问题覆盖用户可能进一步探索的方向。 总结一下,回答的结构应该是:运算符的概述、语法、使用场景、注意事项(包括类型、指针、浮点数)、优先级说明,以及常见错误示例。同时,引用相关参考资料来支持这些要点,例如引用[1]中的运算符优先级,引用[2]中的三目运算符虽然不直接相关,但可以对比说明不同运算符的差异,引用[3]中的赋值运算符与比较运算符的区别。</think>### C语言中`!=`运算符的使用方法 `!=`是C语言中的**不等于运算符**,属于关系运算符类别,用于判断两个操作数的值是否不相等。若值不相等则返回`1`(真),否则返回`0`(假)[^1]。 #### 基本语法 ```c 操作数1 != 操作数2 ``` - **操作数类型**:可以是整型、浮点型、指针或可比较的结构体。 - **返回值**:布尔逻辑值(`1`或`0`)。 #### 使用场景 1. **条件判断** 常用于`if`、`while`等条件语句中: ```c int a = 5, b = 10; if (a != b) { printf("a不等于b\n"); } ``` 2. **循环控制** 用于终止条件判断: ```c int count = 0; while (count != 10) { printf("%d\n", count); count++; } ``` 3. **逻辑组合** 与其他逻辑运算符(如`&&`、`||`)结合使用: ```c if (x != 0 && y != 0) { printf("x和y均不为零\n"); } ``` #### 注意事项 1. **类型匹配** - 若操作数类型不同,编译器会进行隐式类型转换(如整型提升)。例如: ```c float f = 3.14; int i = 3; if (f != i) { // 实际比较 3.14 != 3.0 // 执行代码 } ``` 2. **指针比较** - `!=`可用于指针,判断是否指向不同地址: ```c int *p1 = &a, *p2 = &b; if (p1 != p2) { printf("指针指向不同地址\n"); } ``` 3. **浮点数精度问题** - 避免直接比较浮点数(如`float`、`double`),建议使用误差范围: ```c double x = 1.0 / 3.0; if (fabs(x - 0.333333) > 1e-6) { // 替代 x != 0.333333 // 执行代码 } ``` 4. **运算符优先级** - `!=`的优先级低于算术运算符(如`+`、`*`),但高于赋值运算符(如`=`)和逻辑运算符(如`&&`)[^1]。例如: ```c if (a + 5 != b * 3) { // 等效于 (a+5) != (b*3) // 执行代码 } ``` #### 常见错误示例 - **误用`=`代替`!=`**: ```c if (a = 0) { // 错误:将0赋值给a,条件永远为假 // 不会执行 } ``` - **结构体比较**: ```c struct Point { int x; int y; }; struct Point p1 = {1, 2}, p2 = {1, 2}; if (p1 != p2) { // 错误:C语言不支持结构体的直接比较 // 需逐成员比较 } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值