一段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
附上恶心的原题
&与&& 是有区别的 2!=0為假 a&0永遠都是0 本帖最后由 zc3909 于 2023-11-14 15:38 编辑
&是按位与操作,优先权大于 !=
以上的判断是错的!!
这种让我们这些没学过语言的咋整? 如果不是为了考试或者招聘面试题,为啥不用括号括起来实现毫无异议的状态?这样谁都看的懂,免去了一切人为失误 ackyee 发表于 2023-11-14 15:02
2!=0為假 a&0永遠都是0
(引用自3楼)
2!=0应该为真啊 1a2b3c 发表于 2023-11-14 15:04
这种让我们这些没学过语言的咋整? 如果不是为了考试或者招聘面试题,为啥不用括号括起来实现毫无异议的状 ...
(引用自5楼)
你说对了,这是大一c语言的课后题,实际这么用除非跟自己过不去 zc3909 发表于 2023-11-14 15:04
&是按位与操作,优先权大于 !=
(引用自4楼)
我查到的都是!=优先级高于& a & 2 != 0等价于2&1,位与结果就是0没错吧 鲜衣怒马 发表于 2023-11-14 15:07
我查到的都是!=优先级高于&
(引用自8楼)
无论先算哪个,也想不通为什么结果是0 zc3909 发表于 2023-11-14 15:11
无论先算哪个,也想不通为什么结果是0
(引用自10楼)
2 & 1 = 0b0000010 & 0b00000001 = 0 zc3909 发表于 2023-11-14 15:04
&是按位与操作,优先权大于 !=
(引用自4楼)
{:lol:} 好吧 我眼拙了{:sweat:} 對了看到樓上的恍然大悟你這個是按位與
按位與
按位 來算 2 是10 1是01 按位與結果就是0
这是NewBing给出的答案
看来ChatGPT4比3.5还是厉害了挺多的 istars2005 发表于 2023-11-14 15:52
这是NewBing给出的答案
看来ChatGPT4比3.5还是厉害了挺多的
(引用自14楼)
我用的确实是3.5 我一般像这种情况我会打上括号,有时候容易迷糊 还是代码写得少啊:
dat16 & 0xFF == KEY_VALUE
多栽几次就长记性了 zc3909 发表于 2023-11-14 15:04
&是按位与操作,优先权大于 !=
以上的判断是错的!!
(引用自4楼)
你那图怎么可能按位&操作优先级会大于!=? 你看成取地址操作了吧 本帖最后由 yyts 于 2023-11-14 18:50 编辑
yyts 发表于 2023-11-14 18:49
(引用自19楼)
文心一言就是垃圾 tang_qianfeng 发表于 2023-11-14 18:51
文心一言就是垃圾
(引用自20楼)
所以应该是1才对吗?{:smile:} 不加括号的,都是垃圾 都是谭浩强害的,加个括号能死人么? 就是平时习惯养成的,有些简单的问题找半天。 kitten 发表于 2023-11-14 20:49
都是谭浩强害的,加个括号能死人么?
(引用自23楼)
是的,看上去是牛逼了,估计只有真正的高手这么干 tang_qianfeng 发表于 2023-11-14 23:29
是的,看上去是牛逼了,估计只有真正的高手这么干
(引用自25楼)
真正的高手不会这么写,真正的高手写的程序小学生都能读懂,并且满篇注释 这种运算符优先级是必考的,然而对实际没啥用 精力不要用在这个上面 多打一个括号就搞定了,为啥一定相信记忆呢?而其还折腾半天
比如:for(i=0;i<25+30; i++)
我都会写成: for(i=0;i<(25+30);i++) 我从来都不考虑优先级的问题,超2个数的运算全部加()
记不住那么多优先级
页:
[1]