当前位置: 技术问答>linux和unix
求助:驱动中看到一种平常没有见到的RETURN方法:return 判断语句
来源: 互联网 发布时间:2016-11-05
本文导语: static inline int is_lastmsg(struct s3c24xx_i2c *i2c) { return i2c->msg_idx >= (i2c->msg_num - 1); } 请教高手: 这种return的具体是什么意思?这样写只为了使程序简练还是有别的用途? ps: 我百度过这个问题,...
static inline int is_lastmsg(struct s3c24xx_i2c *i2c)
{
return i2c->msg_idx >= (i2c->msg_num - 1);
}
请教高手:
这种return的具体是什么意思?这样写只为了使程序简练还是有别的用途?
ps:
我百度过这个问题,没有查到结果,不得已才来请教,谢谢啦。
{
return i2c->msg_idx >= (i2c->msg_num - 1);
}
请教高手:
这种return的具体是什么意思?这样写只为了使程序简练还是有别的用途?
ps:
我百度过这个问题,没有查到结果,不得已才来请教,谢谢啦。
|
这个可能是C语言标准里面有定义的了的吧,从bool到 int的转换,可以找下标准来看看。
我记得c语言一开始好像说是没有bool类型的,所以以前那些人写一些库的时候都是自己定义了TRUE和FALSE的。bool是后来标准里面才加的。
关于这种转换估计各个编译器也都肯定有定义的吧,就像楼上各位所说的 0或者1,不过可个编译器有没有不同的支持就不知道了,比如bool在C++ 里面是一个char的大小,到 int是要扩展转换的。
如果楼主把代码改为
if( i2c->msg_idx >= (i2c->msg_num - 1))
return 1;
else
return 0;
那也是一种很好的写法,至少可以确保程序像自己想要的那样工作。
不过别人确定这个语言或者平台有定义(方正我是不是很确定)这种转换就是返回0或者1,那么写也是无所谓的。
===============我来写个gcc的代码,可以看一下=============
int test(int i)
{
return i >30;
}
int main(void)
{
printf ("%dn", test(2));
return 0;
}
080483c4 :
80483c4: 55 push %ebp
80483c5: 89 e5 mov %esp,%ebp
80483c7: 83 7d 08 1e cmpl $0x1e,0x8(%ebp)
80483cb: 0f 9f c0 setg %al
80483ce: 0f b6 c0 movzbl %al,%eax
80483d1: 5d pop %ebp
80483d2: c3 ret
==============
iintel 手册上关于setg的指令的解释。
Sets the byte in the operand to 1 if the Sign Flag equals the
Overflow Flag, otherwise sets the operand to 0.
可以知道确实不是返回0就是返回到1的,
从movzbl %al,%eax 我们也可以知道,bool类型确实当作一个char大小来处理,然后会有个从char到int的转换的。
我记得c语言一开始好像说是没有bool类型的,所以以前那些人写一些库的时候都是自己定义了TRUE和FALSE的。bool是后来标准里面才加的。
关于这种转换估计各个编译器也都肯定有定义的吧,就像楼上各位所说的 0或者1,不过可个编译器有没有不同的支持就不知道了,比如bool在C++ 里面是一个char的大小,到 int是要扩展转换的。
如果楼主把代码改为
if( i2c->msg_idx >= (i2c->msg_num - 1))
return 1;
else
return 0;
那也是一种很好的写法,至少可以确保程序像自己想要的那样工作。
不过别人确定这个语言或者平台有定义(方正我是不是很确定)这种转换就是返回0或者1,那么写也是无所谓的。
===============我来写个gcc的代码,可以看一下=============
int test(int i)
{
return i >30;
}
int main(void)
{
printf ("%dn", test(2));
return 0;
}
080483c4 :
80483c4: 55 push %ebp
80483c5: 89 e5 mov %esp,%ebp
80483c7: 83 7d 08 1e cmpl $0x1e,0x8(%ebp)
80483cb: 0f 9f c0 setg %al
80483ce: 0f b6 c0 movzbl %al,%eax
80483d1: 5d pop %ebp
80483d2: c3 ret
==============
iintel 手册上关于setg的指令的解释。
Sets the byte in the operand to 1 if the Sign Flag equals the
Overflow Flag, otherwise sets the operand to 0.
可以知道确实不是返回0就是返回到1的,
从movzbl %al,%eax 我们也可以知道,bool类型确实当作一个char大小来处理,然后会有个从char到int的转换的。