zc3909 发表于 2023-11-14 14:58:23

一段c代码,大伙帮忙分析一下结果,想不出来是什么原因(已解决)

本帖最后由 zc3909 于 2023-11-14 15:32 编辑

keil和vs2017的结果b都是0,而不是1,为什么?
       char a = 0, ch,b;
        a = 2;
        ch = 'b';
        b = a & 2 != 0;
        if(b) printf("b = true");

ChatGPT和百度文心一言结果也都是1,为什么实际运行是0呢?

弄清楚了:
b = a & 2 != 0;
先执行 2 !=0 这个永远是1,
再执行 a & 1也就是检查最低位是否为1,如果为1 则b为1,否则为0

附上恶心的原题

neverlic 发表于 2023-11-14 15:02:31

&与&& 是有区别的

ackyee 发表于 2023-11-14 15:02:44

2!=0為假      a&0永遠都是0

zc3909 发表于 2023-11-14 15:04:02

本帖最后由 zc3909 于 2023-11-14 15:38 编辑

&是按位与操作,优先权大于 !=

以上的判断是错的!!

1a2b3c 发表于 2023-11-14 15:04:49

这种让我们这些没学过语言的咋整? 如果不是为了考试或者招聘面试题,为啥不用括号括起来实现毫无异议的状态?这样谁都看的懂,免去了一切人为失误

鲜衣怒马 发表于 2023-11-14 15:05:12

ackyee 发表于 2023-11-14 15:02
2!=0為假      a&0永遠都是0
(引用自3楼)

2!=0应该为真啊

zc3909 发表于 2023-11-14 15:06:03

1a2b3c 发表于 2023-11-14 15:04
这种让我们这些没学过语言的咋整? 如果不是为了考试或者招聘面试题,为啥不用括号括起来实现毫无异议的状 ...
(引用自5楼)

你说对了,这是大一c语言的课后题,实际这么用除非跟自己过不去

鲜衣怒马 发表于 2023-11-14 15:07:11

zc3909 发表于 2023-11-14 15:04
&是按位与操作,优先权大于 !=
(引用自4楼)

我查到的都是!=优先级高于&

鲜衣怒马 发表于 2023-11-14 15:11:28

a & 2 != 0等价于2&1,位与结果就是0没错吧

zc3909 发表于 2023-11-14 15:11:58

鲜衣怒马 发表于 2023-11-14 15:07
我查到的都是!=优先级高于&
(引用自8楼)

无论先算哪个,也想不通为什么结果是0

qianj1986 发表于 2023-11-14 15:20:06

zc3909 发表于 2023-11-14 15:11
无论先算哪个,也想不通为什么结果是0
(引用自10楼)

2 & 1 = 0b0000010 & 0b00000001 = 0

ackyee 发表于 2023-11-14 15:35:25

zc3909 发表于 2023-11-14 15:04
&是按位与操作,优先权大于 !=
(引用自4楼)

{:lol:} 好吧 我眼拙了{:sweat:}

ackyee 发表于 2023-11-14 15:37:29

對了看到樓上的恍然大悟你這個是按位與

按位與

按位 來算   2 是10   1是01   按位與結果就是0

istars2005 发表于 2023-11-14 15:52:45



这是NewBing给出的答案
看来ChatGPT4比3.5还是厉害了挺多的

zc3909 发表于 2023-11-14 16:11:03

istars2005 发表于 2023-11-14 15:52
这是NewBing给出的答案
看来ChatGPT4比3.5还是厉害了挺多的
(引用自14楼)

我用的确实是3.5

yuyu87 发表于 2023-11-14 16:11:37

我一般像这种情况我会打上括号,有时候容易迷糊

t3486784401 发表于 2023-11-14 16:27:00

还是代码写得少啊:

dat16 & 0xFF == KEY_VALUE

多栽几次就长记性了

tang_qianfeng 发表于 2023-11-14 18:10:23

zc3909 发表于 2023-11-14 15:04
&是按位与操作,优先权大于 !=

以上的判断是错的!!
(引用自4楼)

你那图怎么可能按位&操作优先级会大于!=? 你看成取地址操作了吧

yyts 发表于 2023-11-14 18:49:30

本帖最后由 yyts 于 2023-11-14 18:50 编辑



tang_qianfeng 发表于 2023-11-14 18:51:41

yyts 发表于 2023-11-14 18:49

(引用自19楼)

文心一言就是垃圾

yyts 发表于 2023-11-14 18:53:04

tang_qianfeng 发表于 2023-11-14 18:51
文心一言就是垃圾
(引用自20楼)

所以应该是1才对吗?{:smile:}

first_blood 发表于 2023-11-14 20:41:19

不加括号的,都是垃圾

kitten 发表于 2023-11-14 20:49:13

都是谭浩强害的,加个括号能死人么?

wqy0410 发表于 2023-11-14 21:17:34

就是平时习惯养成的,有些简单的问题找半天。

tang_qianfeng 发表于 2023-11-14 23:29:05

kitten 发表于 2023-11-14 20:49
都是谭浩强害的,加个括号能死人么?
(引用自23楼)

是的,看上去是牛逼了,估计只有真正的高手这么干

zc3909 发表于 2023-11-15 07:08:20

tang_qianfeng 发表于 2023-11-14 23:29
是的,看上去是牛逼了,估计只有真正的高手这么干
(引用自25楼)

真正的高手不会这么写,真正的高手写的程序小学生都能读懂,并且满篇注释

sd.shi 发表于 2023-11-15 08:27:15

这种运算符优先级是必考的,然而对实际没啥用

shiva_shiva 发表于 2023-11-15 09:56:11

精力不要用在这个上面

sunrn123 发表于 2023-11-15 15:26:33

多打一个括号就搞定了,为啥一定相信记忆呢?而其还折腾半天
比如:for(i=0;i<25+30; i++)
我都会写成: for(i=0;i<(25+30);i++)

lw32 发表于 2023-11-16 14:52:29

我从来都不考虑优先级的问题,超2个数的运算全部加()
记不住那么多优先级
页: [1]
查看完整版本: 一段c代码,大伙帮忙分析一下结果,想不出来是什么原因(已解决)