搜索
bottom↓
回复: 20

菜鸟求教:关于单片机C语言里if语句的一点疑问

[复制链接]

出0入0汤圆

发表于 2022-4-18 16:22:30 | 显示全部楼层 |阅读模式
如题目,之前写程序的时候对于一些需要判断的标志位,或者引脚输入,或者一些条件。
我都是写if(0 == P00),if(0 == flag),if(0 == variate)(声明int variate,判断是不是为零。)

我也有尝试过写if(P00),if(flag),if(variate)。还有if(!P00),if(!flag),if(!variate)。我觉得这样写比较方便,也少打两个字哈哈
但是我同事和我说不要这样写,容易出一些问题。我问他会出什么问题,他说一时候也说不清。反正有时候会出一些奇怪的问题。那之后我就再也没这样写过了。

后来看书,看到有作者说,if(a == 0)这样写表达不清楚,就应该写if(a),if(!a)......我就感觉很迷惑了。有点搞不清,是各有利弊吗还是谁说的不对?都会出什么问题啊?

所以是想问一下,单片机里做判断,是if(a)这样比较好,还是if(1 == a)这样比较好。

出0入0汤圆

发表于 2022-4-18 16:40:02 | 显示全部楼层
根据各公司的规范用例。

没有就按自己的来造一个。

造好之后自己也要按自己造的规范用例来就行了。

出0入399汤圆

发表于 2022-4-18 16:41:39 | 显示全部楼层
a==1这样好吧,以后改程序判断a等于其他数字的时候改后面的数就行了

出0入0汤圆

发表于 2022-4-18 16:59:32 | 显示全部楼层
这个其实也有个人偏好

对高低电平判断这种情况,我会用 gpio 和 !gpio 这样的写法
但对于类似“成功时返回 0, 失败时返回 -1”这种情况,我会用 rc == 0 或者 rc != 0 来判断,而不是 !rc, rc

简单说就是判断如果涉及到了具体值,那最好出现这个值。如果只是 true/false 两种情况,可以用 var, !var

出40入45汤圆

发表于 2022-4-18 17:11:20 | 显示全部楼层
我用 if (1==a)
这样的话,a会刷新(也有可能不刷新);当少输入一个 = 号时,编译器还会报错。

出0入0汤圆

发表于 2022-4-18 17:20:18 | 显示全部楼层
对于布尔形式的来说if(a) 何if(a==true)是一回事,后者也有推荐写成if(true == a)的情况,这样可以避免少写一个等号的错误,会编译不通过。
对于整数形式的,往往推荐写成if(1==a)的形式,把条件写明。因为if(a)这种条件,对于a>0的情况都为真,比如a=2一样满足。这样可能可以避免一些的问题。

出0入16汤圆

发表于 2022-4-18 17:37:02 | 显示全部楼层
C语言无所谓,高阶的一些语言if只能判断布尔量,if(a==1)这样写可以明确知道自己要和什么进行比较,1也可以写成宏定义或者枚举

出0入217汤圆

发表于 2022-4-18 22:35:07 | 显示全部楼层
我的习惯是如果判断的是bool变量则不加==0这种判断,如果判断一个数值为零则必须加上==0这种判断。

出0入8汤圆

发表于 2022-4-18 23:01:24 来自手机 | 显示全部楼层
ehengio 发表于 2022-4-18 22:35
我的习惯是如果判断的是bool变量则不加==0这种判断,如果判断一个数值为零则必须加上==0这种判断。 ...
(引用自8楼)

对的,就是这个规则。
另外,补充一下:gpio 的高低逻辑判断并非布尔值的范畴(而是判断结果是布尔值)。

出0入217汤圆

发表于 2022-4-18 23:42:47 | 显示全部楼层
顺便说一句,我个人不喜欢1==a这种写法。一般就写成a==1。
绝大多数编译器会识别a==1误写成a=1,没必要为了这个降低可读性。

出0入0汤圆

发表于 2022-4-18 23:50:52 | 显示全部楼层
ehengio 发表于 2022-4-18 23:42
顺便说一句,我个人不喜欢1==a这种写法。一般就写成a==1。
绝大多数编译器会识别a==1误写成a=1,没必要为了 ...
(引用自10楼)

int a = 1234;

if(a==0)和if(a)的结果是确定的
if(!a)的结果可能不是你预期的

if(!P00)很可能不是你预期的,对于GPIO,最好先读IO保存到变量再判断变量,有variate修饰也不一定管用

哪个神仙作者说if(a==0)会表达不清楚?

要明白,如果编译器本身不完全支持C规范,那么你完全照搬C规范而不理会编译器实际的差异,那就是给自己挖坑
完全支持C规范的单片机编译器,好像没有。
知道C规范所有细节的工程师,更加没有,当然我也绝对是不了解的

出0入1209汤圆

发表于 2022-4-19 01:09:12 | 显示全部楼层
本帖最后由 kitten 于 2022-4-19 01:13 编辑
ehengio 发表于 2022-4-18 23:42
顺便说一句,我个人不喜欢1==a这种写法。一般就写成a==1。
绝大多数编译器会识别a==1误写成a=1,没必要为了 ...
(引用自10楼)


MDK下这样写,毛警告都没有。因为这个问题吃过亏。

出0入8汤圆

发表于 2022-4-19 08:56:30 | 显示全部楼层
ehengio 发表于 2022-4-18 23:42
顺便说一句,我个人不喜欢1==a这种写法。一般就写成a==1。
绝大多数编译器会识别a==1误写成a=1,没必要为了 ...
(引用自10楼)

其实上 a == 1 和 1 == a,
a 只是一个变量,并不会降低可读性,毕竟这个写法很简短,或者说很简单吧。
或许你掺杂了个人主观想法,所以认为它的可读性差了点。

出30入42汤圆

发表于 2022-4-19 09:30:18 | 显示全部楼层
1. if 判断的表达式为布尔类型,这个是语法规定的,所以 if(0 == P00)是符合规范的、结果确定的;
2. if(P00) 的表达式为非布尔类型,这需要编译器做隐含的转换,也就是将这个转换工作交给了编译器。但编译器做这种隐含转换的结果可能是不确定的,不同的编译器的理解也可能是不同的,这就带来了安全问
    题、移植问题等。

所以,在 MISRA C 标准中规定:语句中的操作数不得是不适当的基本类型。目的就是为了规避这类依赖于编译器的不确定性所造成的安全、移植等问题。如果你做 MISRA C 检查,if(P00) 就会被警告, if(0 == P00)则不会。

出0入362汤圆

发表于 2022-4-19 09:39:15 | 显示全部楼层
1==a这种是Pascal转c家族程序员的习惯, 哈哈哈

出1310入193汤圆

发表于 2022-4-19 10:07:24 | 显示全部楼层
矩阵时间 发表于 2022-4-18 17:11
我用 if (1==a)
这样的话,a会刷新(也有可能不刷新);当少输入一个 = 号时,编译器还会报错。 ...
(引用自5楼)

MDK  会

出0入0汤圆

发表于 2022-4-19 10:57:13 | 显示全部楼层
kitten 发表于 2022-4-19 01:09
MDK下这样写,毛警告都没有。因为这个问题吃过亏。
(引用自12楼)

MDK4开始写出if(a=1)都会给出警告

出0入12汤圆

发表于 2022-4-19 11:08:22 | 显示全部楼层
if (a) 和 if (1 ==a) 不等同,例如,当 a = 5 的时候。主要是 C 里面没有 bool,个人喜欢完整的写法,明确。

出0入4汤圆

发表于 2022-4-19 12:23:05 | 显示全部楼层
矩阵时间 发表于 2022-4-18 17:11
我用 if (1==a)
这样的话,a会刷新(也有可能不刷新);当少输入一个 = 号时,编译器还会报错。 ...
(引用自5楼)


现在的编译器把数字放到后面也会有警告

出40入45汤圆

发表于 2022-4-19 14:12:00 | 显示全部楼层
carefree1986 发表于 2022-4-19 12:23
现在的编译器把数字放到后面也会有警告
(引用自19楼)

这个改动好,能起到提醒作用

出0入4汤圆

发表于 2022-4-20 09:41:14 | 显示全部楼层
我一律写为if( a == 0 ) 或 if( a == TRUE );  没有必要省略为if( a ), 有时代码写多了, 觉得越明了越好
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 14:10

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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