细数linux内核里那些偏门的C语言语法(一)简化三目运算

来源:互联网 发布:默沙东临床数据管理员 编辑:程序博客网 时间:2024/06/07 05:44
 
 以前上课时我们老师说他只是熟悉C语言算不上精通,我当时就觉得奇怪,老师懂那么多还不算精通?
工作后觉得自己C语言已经比较熟悉,直到阅读linux内核源码才发现,C语言还有很多很多我们不知道的东西,我们离所谓的精通其实还很远。
 
先从一个我在内核源码我看到的三目运算说起。
 
这里先简单介绍一下三目运算,就是  表达式1 ? 表达式2 : 表达式3

当表达1结果非0时,程序会执行表达式2,结果为表达式2的执行结果

当表达1f结果为0时,程序会执行表达式3,结果也为表达式3的执行结果

 

比如

 

int a = 3;

int b;

b = a? 2 : 6;

如果a为0,b 结果为6,其余结果为2。

 

 

近来在弄linux驱动的GpioKey,在跟static int __devinit gpio_keys_probe(structplatform_device *pdev)  时发现,有一段代码如下:

 

unsignedint type = button->type ?: EV_KEY;

 

当时就觉得奇怪,三目运算 ,应该有三个表达式,为什么只有两个?

是不是表达式2被省略了?

如果button->type为真,type的值等于button->type?

 

 

有了这样的假设,我就写了一个代码验证

#include int main(){int a = 3;printf("a = %d\n", a?:4);}

执行结果为3,证明我的想法正确。

 

得出下面结论:

三目运算形式为  表达式1 ?:表达式2   时

当表达式结果1非0,结果为表达式1 否则结果为表达式2

 

有错误的地方还请大家指正,共同学习一起进步。

 

 

原创作品,转载请注明出处,谢谢

 

阅读全文
0 0
原创粉丝点击