找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1867|回复: 32
收起左侧

一个c语言写法的问题 有兴趣的看看

  [复制链接]
ID:47286 发表于 2021-12-2 10:59 | 显示全部楼层 |阅读模式
如果a与b 第一种写是 a=a&b 第二种写法 a&=b
那现在要 a与b与c 第一种写是 a=a&b&c 问题是 有第二种写法吗
回复

使用道具 举报

ID:578842 发表于 2021-12-2 12:49 | 显示全部楼层
你把&和=的你优先级考虑上就知道了
回复

使用道具 举报

ID:624769 发表于 2021-12-2 13:57 | 显示全部楼层
写法其实没所谓,学单片机把时间花在这上面不值得……

不管你写 a &= b;
还是你写 a = a&b;

你编译一下,然后 CTRL + F5 , 看看编译出来的代码,都是一样的。 换句话说,对于编译器来讲,你不同的写法就是 宋体 还是 仿宋体 的区别,那个字还是那个字。
回复

使用道具 举报

ID:47286 发表于 2021-12-2 15:09 | 显示全部楼层
沙发 讲真 和你一样的这种回答方式我都不太喜欢 技术论坛又不是悟道 话还说一半留一半
回复

使用道具 举报

ID:47286 发表于 2021-12-2 15:10 | 显示全部楼层
188610329 发表于 2021-12-2 13:57
写法其实没所谓,学单片机把时间花在这上面不值得……

不管你写 a &= b;

你没看明白内容

我是问 如果三个与的时候 有别的写法么

这个小事算不上值得不值得吧 多了解一点又没啥坏处
回复

使用道具 举报

ID:624769 发表于 2021-12-2 15:29 | 显示全部楼层
dzbj 发表于 2021-12-2 15:10
你没看明白内容

我是问 如果三个与的时候 有别的写法么

你可以写成  a &= b&C;
回复

使用道具 举报

ID:624769 发表于 2021-12-2 15:43 | 显示全部楼层
dzbj 发表于 2021-12-2 15:10
你没看明白内容

我是问 如果三个与的时候 有别的写法么

你可以写成  a &= b&C;

然后,回应一下你在地板的问题。

如果你问的是  a &= b&C; 是什么意思, 可能会答复的乐意的一点。
但是,你问  a = a & b &c; 还有什么别的写法,就会让人比较不喜。

你看看论坛里,有多少编程不懂多少,逻辑不清晰的,代码写的极其花哨的,发个求助帖代码还是一层套一层的,阅读性极差的。一边求助,一边增加帮助人的阅读成本。真要是只会基础写法,一句句写代码,估计能帮她的会更多。或者说更多人愿意帮她。

个人观点,仅供参考。
回复

使用道具 举报

ID:824490 发表于 2021-12-2 15:53 | 显示全部楼层
"回"字有4种写法
读过书的都知道吧?
回复

使用道具 举报

ID:47286 发表于 2021-12-2 15:55 | 显示全部楼层
188610329 发表于 2021-12-2 15:29
你可以写成  a &= b&C;

哦 谢谢 了解了 还可以这么写

我是写个有源蜂鸣器通断 有个限制条件 必须满足蜂鸣器才工作 后来又加了个条件 就好奇 想知道一下有没有其它写法了
回复

使用道具 举报

ID:47286 发表于 2021-12-2 16:01 | 显示全部楼层
名字不是重点 发表于 2021-12-2 15:53
"回"字有4种写法
读过书的都知道吧?

呵呵 都是搞技术的绕啥弯啊 知道就直说 看不上也可以直说
回复

使用道具 举报

ID:824490 发表于 2021-12-2 16:15 | 显示全部楼层
dzbj 发表于 2021-12-2 16:01
呵呵 都是搞技术的绕啥弯啊 知道就直说 看不上也可以直说

那我就直说了:搞那些花哨玩艺,然并。。你看得懂不代表后来者看得懂。。代码的灵魂逻辑,能让人一看明白的写法,自然胜过那些弯弯绕的写法。一不小心写错了,查都不好查。个人还是趋向于简单的写法。

说句不好听的,这叫卖弄、装,除了这些,对代码的优化没有半点帮助。

{不喜勿喷,通知必删}
回复

使用道具 举报

ID:139866 发表于 2021-12-2 16:34 | 显示全部楼层
为什么这样你有一万黑币啊
回复

使用道具 举报

ID:47286 发表于 2021-12-2 17:06 | 显示全部楼层
名字不是重点 发表于 2021-12-2 16:15
那我就直说了:搞那些花哨玩艺,然并。。你看得懂不代表后来者看得懂。。代码的灵魂逻辑,能让人一看明白 ...

嗯 嗯 你说的都有道理 也对 我支持你的看法 但请允许我保留自己的看法 毕竟这个世界很大 不应该只有一种看法 你说对么 何况 我也没想怎么样 只是好奇而已 好奇和懒是推动人类文明发展极大的动力 你说是么

至于是卖弄还是装B 你可以有你的看法 就像有人看见穿比基尼的女人就撇嘴 觉得低俗 他当然可以这么想但并不表示其它人不能喜欢 对吧

在非原则性的问题上 每个人都有保留自己想法的权力
回复

使用道具 举报

ID:47286 发表于 2021-12-2 17:09 | 显示全部楼层
天ノ忆 发表于 2021-12-2 16:34
为什么这样你有一万黑币啊

因为我喜欢这里 所以每天都登录 每天登录就会有黑币 日子久了就有这么多 基本就是这样 就我的水平而言没啥可回帖的东西 很多人都比我强 我回的很少
回复

使用道具 举报

ID:47286 发表于 2021-12-2 17:21 | 显示全部楼层
188610329 发表于 2021-12-2 15:43
你可以写成  a &= b&C;

然后,回应一下你在地板的问题。

感谢你回帖 你说的情况我也有体会 通常我不喜欢看的就不看也不回就完了 但我通常不会说什么 因为我初学的时候 有很多问题卡住 而我发贴求助的时候 我说的太外行了 前辈看不懂 也懒得理我 就没人回 那时候我真是感觉太难学了 上天无路入地无门

现在虽然我懂了一点 但还是很初级 而那些我看不懂的 不喜欢看的 我就闭嘴 给人家一个求助的可能

至于花哨 我只能说 那是人家的喜好 凭什么代码就一定要方方正正的 喜欢效率没错 也对 坚持自己的选择好了 喜欢花哨只要能实现功能 也没错 干嘛要去鄙视呢
回复

使用道具 举报

ID:401564 发表于 2021-12-2 17:38 | 显示全部楼层
a=a&b&c 这个已经让人明白了这语句是要干嘛的.而且,这也不要需要大量的输入
a&=b&c 这个你可以验证一下,我不知道也不想知道这样对不对
因为这真的不重要,就像楼上说的"回字有四种写法"
a=a&b&c实在是太没有深入的意义了,对比于a&=b&c,a=a&b&c能进化出什么来呢?不管是对于程序的编写还是对于中东局势,它都没有什么深远的影响,何必把心意花在这上面?
当然,如果你是像我这样无聊的人,那还是可以理解的
回复

使用道具 举报

ID:987318 发表于 2021-12-2 17:47 | 显示全部楼层
第二种写法是:a &= b&c;    a &= b 其实是 a = a&b 的一种更简单的等价形式,重点关注变化量,a = a+1 可以写成 a += 1 关注增量,是一个道理
回复

使用道具 举报

ID:47286 发表于 2021-12-2 19:02 | 显示全部楼层
Y_G_G 发表于 2021-12-2 17:38
a=a&b&c 这个已经让人明白了这语句是要干嘛的.而且,这也不要需要大量的输入
a&=b&c 这个你可以验证一下,我 ...

感谢回帖

我纯粹是因为不知道有3个条件的时候 有啥其它写法 然后 就想问问 知道一下 就这么简单

一个纯粹的技术问题 想其它的都是想多了
回复

使用道具 举报

ID:47286 发表于 2021-12-2 19:04 | 显示全部楼层
hehehao 发表于 2021-12-2 17:47
第二种写法是:a &= b&c;    a &= b 其实是 a = a&b 的一种更简单的等价形式,重点关注变化量,a = a+1 可 ...

感谢回帖 我之前不知道三个条件的时候还可以这么写 我看过的书上也没说过
回复

使用道具 举报

ID:987378 发表于 2021-12-2 20:24 | 显示全部楼层
C的话不能同时,估计得写a&=b&&a&=c
回复

使用道具 举报

ID:624769 发表于 2021-12-2 20:46 | 显示全部楼层
dzbj 发表于 2021-12-2 19:04
感谢回帖 我之前不知道三个条件的时候还可以这么写 我看过的书上也没说过

想来想去,还是补充说明一下,唉……,又得打好多字。

正确来讲,在KEIL C 中,  a = a & b & c;  是没有另外一种写法的。但是,怕被半吊子的人喷,我还是跟你说了可以写成:  a &= b&c;  这种写法,从结果论来讲,是正确的,但是从过程论来讲是错误的。
因为严格意义上来说:   
a &= b & c;  其实应该等同于   a = a & (b & c);   
而 a = a & b & c 是等同于: a = (a & b) & c;
这两个式子,就结果而言,是相等的,就过程而言差别是非常大的。

假定,不是 a = a & b & c;   假定是: a = a & b | c
那么,你会发现,  a = (a & b) | c   和 a = a &(b | c); 结果是完全不同的。
我们以 a = 0x55, b = 0x0f, c= 0xf0 为例,
前者计算出来, a = 0xf5, 后者算出来 a = 0x55;

上述的举例,你应该能理解 a = a & b & c; 严格来讲没有另一种写法的理由了。

然后再跟你讲讲如何才是,真正的 a = a & b & c;  的另外一种写法。
首先定义:
#define   alland(x,y,z)          (x) = (x) & (y) & (z)

然后,当你程序写  alland(a,b,c)    的时候, 就等同于 a = a & b & c; 是完完全全等同。
先不要嗤之以鼻, 这个看上去很无聊的做法,其实,原理和 a &= b;  等同于 a = a & b; 是一样的道理。区别在于,一个是在编译器里面默认定义了,一个是你手动定义了。本质是一样的。

多的我不想说,我只想让你明白,为什么你这个问题,那么多人都不爽的原因。说到底,真的是毫无意义的事情。最根本的掌握了才是王道,多种写法,换个编译器就能多出很多,或者你有时间,自己都能定义出很多。
回复

使用道具 举报

ID:47286 发表于 2021-12-2 21:51 | 显示全部楼层
188610329 发表于 2021-12-2 20:46
想来想去,还是补充说明一下,唉……,又得打好多字。

正确来讲,在KEIL C 中,  a = a & b & c;  是 ...

非常感谢 你这个写的对我来说很有料

我只是依稀的感觉 会有什么不妥 但自己也说不清 也想不明白 你说的带()那行如醍醐灌顶 一下就明白之前自己依稀感觉的不对头了 假如真这么写确实应该注意这点 结果会出问题

至于有没有意义 这个吧。。。。。我觉得啊。。。。。。各人对意义的理解不一样

我们一帮男人都挺喜欢汽车的 一帮人一起能聊的很深 而且有自己的看法 当然免不了谈自己想买什么车 男人嘛 多半是动力啦 操控啦 巴拉巴拉巴拉 你理解就好 我们单位一个女士 问我们应该买什么车 我们说了好多 人家都不要 后来 我们问她要什么样的啊 人家说 要好看的

哈哈 你理解了么 那种我们嗤之以鼻看不上的东西 就是人家喜欢的 是人家要的 人家愿意花钱的 人家错了么 人家没讨厌我们天天聊机械 我们凭什么看不上人家就喜欢好看的车 所以工科狗不容易找老婆呢 太认死理 人家问了 对人家有意义就行了 凭什么不喜欢啊 再说了 不喜欢可以不说嘛
回复

使用道具 举报

ID:47286 发表于 2021-12-2 22:03 | 显示全部楼层
188610329 发表于 2021-12-2 20:46
想来想去,还是补充说明一下,唉……,又得打好多字。

正确来讲,在KEIL C 中,  a = a & b & c;  是 ...

另外 你回帖中这句

#define   alland(x,y,z)          (x) = (x) & (y) & (z)

我理解 实际上有用的就是后边这个 (x) = (x) & (y) & (z) 而这个 和直接写x=x&y&z是一样的 就是你说的 完全没意义 直接写x=x&y&z好了 而最终结果是 假如都是& 如果喜欢或者习惯的话 可以用第二种写法 但如果有&和| 那么写就可能出问题
回复

使用道具 举报

ID:879348 发表于 2021-12-3 08:37 | 显示全部楼层
考试就爱考这种无意义的问题
回复

使用道具 举报

ID:47286 发表于 2021-12-3 09:24 | 显示全部楼层
wufa1986 发表于 2021-12-3 08:37
考试就爱考这种无意义的问题

我上学的时候也老这么想 现在想想 学习时期和工作时期目的不一样

设计汽车的人知道螺丝的重要性 但不会去研究螺丝的具体工艺要求 但学习的时候 就有必要了解螺丝的工艺 不然不会建立正确的螺丝选择观

前面那位前辈说多这句 我个人认为就是意义 虽然讨论这个怎么写很多人看来可能就是没意义 因为你们可能都是科班出来的吧 这种简单到规则的东西无所谓 我这种半路出家的就不一样了 毕竟没受过专门培训

“假定,不是 a = a & b & c;   假定是: a = a & b | c
那么,你会发现,  a = (a & b) | c   和 a = a &(b | c); 结果是完全不同的。”

所以吧 意义对各人来说 含义不一样 人有时候可能就是容易认为我知道的别人就应该也知道 但实际上不一定
回复

使用道具 举报

ID:624769 发表于 2021-12-3 13:46 | 显示全部楼层
dzbj 发表于 2021-12-2 22:03
另外 你回帖中这句

#define   alland(x,y,z)          (x) = (x) & (y) & (z)

既然,你对这个有兴趣,我又正好现在没事,就跟你好好聊聊,希望你有耐心看完。

#define   alland(x,y,z)          (x) = (x) & (y) & (z)
#define   allor(x,y,z)          (x) = (x) | (y) | (z)
#define   andthenor(x,y,z)          (x) = (x) & (y) | (z)
#define   andafteror(x,y,z)          (x) = (x) & ((y) | (z))
#define   orthenand(x,y,z)          (x) = (x) | (y) & (z)
#define   orafterand(x,y,z)          (x) = (x) | ((y) & (z))

由此,可以看出,只要你定义的足够的多,就能有“第二种写法” 应对各种情况。 但是,如果你都用这种方法写代码,自己写是没有问题,如果这代码转给第三人看,或者发帖求助,别人是劈死你的心都有。

那么,既然换一种写法有那么多人会不爽,为什么 会有 a &=b; 和 a = a & b; 编译器自带的这两种写法呢?这个牵涉到历史遗留问题,别急,会跟你讲清楚的。

最开始,最正统的C语言,是只有  a = a & b; 这一种写法的, 等号左边是赋值目的地,等号右边是表达式,或者说计算方式。这个表达方式用现在的话来讲, 很"C语言"。
那么为什么后来会引入(或者说创造出) a &= b; 这种不正统的书写方式呢? 受环境所迫。就和现在新产品面世,必须要推广建立用户基础一样,C语言推出之初,是没有用户基础的,那时候大多数人都在用A语言,即汇编。C语言门槛低,适合初学者,这是没错,但是,每人愿意学啊,就好像屠龙绝技学了,之后你没有龙可以屠,有什么用呢? 初学者学了C, 开发团队的前辈们还在用A, 这怎么搞?(当时并没有汇编和C混合编程这个功能的)。于是,让已经编程多年的老手,转移到C ,成了关键。其中商业当中的运作,弯弯绕绕就不讲了,直接跳到关键点。 C语言的语法,对用了一辈子汇编的人来说,是非常不友好的。为了让这些人更快的掌握C, 于是C语言非常“贴心”的增加了,符合汇编人的书写习惯的“第二种写法”。
比如说: a = a & b;  他的意思是,把 a 和 b 相与 并且,把结果保存到 a  
汇编中,没有这种写法的,汇编中只有类似这样的:  ANL A,B    即把 B 的值 与到 A,  汇编中不需要考虑结果保存去哪里,也不能考虑结果保存在哪里,
所以,针对汇编用户的习惯, C语言 “很贴心” 的 增加了  a &= b; 这种 “很汇编” 的写法。 同类的还有很多,
比如:  a |= b;   对应:   ORL  A,B
比如:  a +=b;   对应:   ADD  A,B
比如:  a++       对应:   INC  A
比如:  a--         对应:   DEC  A又比如: while(!TI);  对应: JNB TI,$      正统的写法应该是用表达式: while(TI == 0)  等等,很多很多。
总之,为了拉拢这批  老编程员 投入C的怀抱,提供了大量的“很汇编”的“第二种写法”。
所以,刚开始的时候,这一类的 “不怎么C” 的C语言,反而是使用频率最高的。而新人们,虽然可能没有学过汇编,看到前辈们这样写,为了不给前辈们增加阅读成本,也尽量的这么写。(现在看来,以前的新人们真的很贴心)。 所以,这些新人们,也习惯了使用这种“非标”的C代码,久而久之本来作为权益之计的“第二种书写法”就根深蒂固的成为了一种标准书写规范。哪怕进化到了 TC , C++, 都一直延续保留了下来。

扯远了,我们扯回来。重点来了:
你会经常在看别人的代码里看到  a &= b; a +=b; 这些“非标”的书写方式, 但是,你很好奇 a = a & b & c 有没有类似的写法,因为你在别人的代码里没有机会看到。 那么,为什么你会看不到呢? 不是因为没有,不是因为写不出来, 因为  a = a & b & c  完全不符合 汇编逻辑。 所以不会有人使用 “很汇编” 的写法,去写这样的表达式,所以,你看不到实例。 硬写是可以的, 根据实际应用情况, 可以写成 a &= b & c; 也可以由第三种写法,但是,这样做就刻意了。 老汇编程序员, 把 a = a & b;  写成 a &= b;  可以提高阅读效率,降低阅读成本, 但是  a &= b & c  这种写法,对于习惯汇编逻辑的老程序员一样是要绕脑子的。 所以,他本人不会这样写, 新人们也不会这样写,因此,你基本不会在他人程序里面看到,假如有看到,那么这个人一定是 刻意装X的,决不是习惯问题,或者编程逻辑问题。

洋洋洒洒写了一大堆,主要是让你了解一下,有多种写法的历史背景,以及为什么很多人会习惯用一些 “很不C” 的 “第二种写法”。 算是“科普”吧。

评分

参与人数 2黑币 +30 收起 理由
w1179benp + 15 很给力!
一片一城 + 15 很给力!

查看全部评分

回复

使用道具 举报

ID:47286 发表于 2021-12-3 20:16 | 显示全部楼层
188610329 发表于 2021-12-3 13:46
既然,你对这个有兴趣,我又正好现在没事,就跟你好好聊聊,希望你有耐心看完。

#define   alland(x,y ...

太感谢了 你讲的非常清楚 我都认真读了 而且终于明白为什么会这样 你说的这些 真是书里看不见的东西 不知道别人怎么看 我很喜欢 几乎是一个历史 编程语言的历史故事 虽然只是技术 但技术里的人文也挺有意思的

不知道怎么感谢你好 我发个最近我做的东西给你看 你觉得行么 本来我是懒得发这些 要调整图片挺麻烦的 而且也不是产品 就是自己用的 但讲编程 显然我没啥可和你交流的 差太远 不知道你对个人制造是否有兴趣 有我就整理一下发 没兴趣就再找机会
回复

使用道具 举报

ID:624769 发表于 2021-12-4 00:34 | 显示全部楼层
dzbj 发表于 2021-12-3 20:16
太感谢了 你讲的非常清楚 我都认真读了 而且终于明白为什么会这样 你说的这些 真是书里看不见的东西 不知 ...

无需感谢,不必放在心上。

你若有时间,自己也想整理,那么就分享一下, 如果时间有限,有事缠身,也不必刻意。
很多时候,懒癌发作,是身体一种保护机制,是提醒你需要休息。
回复

使用道具 举报

ID:911455 发表于 2021-12-4 09:44 | 显示全部楼层
想起的谭浩强里的破书,一大堆运算符堆到一起,问哪个先执行,优先级这东西,与其去花心思,加个括号他不香吗
回复

使用道具 举报

ID:139866 发表于 2021-12-4 12:18 | 显示全部楼层
innere 发表于 2021-12-4 09:44
想起的谭浩强里的破书,一大堆运算符堆到一起,问哪个先执行,优先级这东西,与其去花心思,加个括号他不香 ...

那一套完全就是为了不挂科准备的,实际应用中这么写,我肯定要把他头锤爆!
回复

使用道具 举报

ID:678280 发表于 2022-1-12 11:21 | 显示全部楼层
188610329 发表于 2021-12-3 13:46
既然,你对这个有兴趣,我又正好现在没事,就跟你好好聊聊,希望你有耐心看完。

#define   alland(x,y ...

刚看到你的短文。

对初学的我来说,明白了让我迷惑的“ !TI ”, 其实就是让人一眼能够看明白的 “TI==0”。
回复

使用道具 举报

ID:1001464 发表于 2022-1-12 11:27 | 显示全部楼层
要了解一下= 和&的优先级,另外,不建议一定这么写,这在很多白盒测试过不了的
回复

使用道具 举报

ID:884042 发表于 2022-1-14 14:58 | 显示全部楼层
Y_G_G 发表于 2021-12-2 17:38
a=a&b&c 这个已经让人明白了这语句是要干嘛的.而且,这也不要需要大量的输入
a&=b&c 这个你可以验证一下,我 ...

真心感觉你怼人很NB。。。。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表