lancaster99 发表于 2022-11-28 17:19:07

关系运算符

x = 7 || 6 > 7 && 3+4

请问这个怎么表述

jackz007 发表于 2022-11-28 18:06:35

本帖最后由 jackz007 于 2022-11-28 18:08 编辑

      && 运算符优先级高于 || 所以,这个表达式可以写为:
x = 7 || (6 > 7 && 3 + 4)
      这个表达式是两个子表达式通过逻辑或(||)连接,根据短路逻辑,需要按照从左到右的顺序测试左、右两个子表达式的值,如果左值为 false,表达式的值由右值决定,需要继续测试右值;如果左值为 true,则无需测试右值,即可确定表达式的值为 true。
      【x = 7】: 表达式 x = 7 的值为 7,逻辑值为 true,所以,无需继续测试,可以确定整个表达式的值为 true。

zwj.123 发表于 2022-11-28 20:54:17

本帖最后由 zwj.123 于 2022-11-28 20:59 编辑

依次判断,是为1,不是为0,首先,如果是x=7,1||0为1,接着1&&3就为1,然后1+4=5;
如果x!=7,就是0||0==0,0&&3==0,0+4=4;
这样应该对吧,我感觉不大对,刚我敲了一下发现无论怎样结果都是1

zwj.123 发表于 2022-11-28 20:56:29

zwj.123 发表于 2022-11-28 20:54
依次判断,是为1,不是为0,首先,如果是x=7,1||0为1,接着1&&3就为1,然后1+4=5;
如果x!=7,就是0||0==0 ...

矮油,第一个x=7是赋值符号

zhangjinxuan 发表于 2022-11-29 11:47:50

x = 7 || 6 > 7 && 3+4
因为 && 的优先级大于 || 的优先级,所以可以这样写:
x = 7 || (6 > 7 && 3+4)
不过编译器还是会先算 x = 7, x = 7 虽然是一个赋值语句,但是有返回值的,他赋值为什么就返回什么

比如声明了一个 double 类型的 s,printf("%g", s = 3.141) 则会打印 3.141

所以, x = 7 返回 7,但前提是 x 被声明过,且为数字类型

表达式就变成了:
7 || (6 > 7 && 3+4)
现在来算 7,不过在编译期眼里,只要不是零,转为布尔类型就都是真,不管你是 -1,还是 "Hello", 所以,|| 的左边就是真

但是,根据短路求值的原理,后面的就无需计算,你想一想,逻辑与 的运算规则是什么?只要有一个是真,那么全部都是真,现在我们已经算出来左边是真了,那么右边不管是什么整个表达式都为真,是吧

所以,整个表达式的作用就是:
1. 将 x 的值赋值为 7;
2. 返回真,也就是 1。


可以给一个最佳吗{:10_254:}

weimengnan006 发表于 2022-11-29 17:37:22

x = 7 || 6 > 7 && 3+4
1. “=”单一个这个是赋值运算符,可最后在看
2. 算数运算符的优先级要高于比较运算符和逻辑运算符,所以先计算算数运算符6>7, 为false, 为0, 就变成了x = 7 || 0 && (3+4)
3. 从左到右计算逻辑运算符: 7||0 为7, 7&&7为真,为1
4,故,最后x = 1

weimengnan006 发表于 2022-11-29 17:39:00

zwj.123 发表于 2022-11-28 20:54
依次判断,是为1,不是为0,首先,如果是x=7,1||0为1,接着1&&3就为1,然后1+4=5;
如果x!=7,就是0||0==0 ...

那个是“=”,而不是“==”,不能这么用

ExiaGN001 发表于 2022-11-29 22:10:09

x= (7 !=0)或 (6>7和3+4 != 0都成立)中至少成立一个
这个表达式的值是 1(true)
页: [1]
查看完整版本: 关系运算符