您的位置:首页 > 运维架构 > Linux

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

2017-06-17 16:36 302 查看
 
 以前上课时我们老师说他只是熟悉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

 

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

 

 

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

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息