细数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
有错误的地方还请大家指正,共同学习一起进步。
原创作品,转载请注明出处,谢谢
相关文章推荐
- 细数linux内核里那些偏门的C语言语法(三) !!(x)
- 细数linux内核里那些偏门的C语言语法(二)x... 与 #x
- 细数linux内核里那些偏门的C语言语法(四)(unsigned long)-MAX_ERRNO
- Swift语法基础:12 - Swift的比较运算, 三目条件运算, 区间运算, 逻辑运算
- C# 语法技巧_三目运算_switch_case
- Python模拟C语言的三目运算
- c语言基本运算中的自增运算符和自减运算符以及三目运算符
- C语言 - > 算数运算 / 赋值运算 / 关系运算 / 逻辑运算 / 三目运算
- 【C语言学习笔记】基础语法及基本运算
- 黑马程序员--ios基础--c语言--基础语法、基本运算
- C语言初级语法终章--位运算
- C语言初级语法终章--位运算
- 黑马程序员--c语言各种运算
- C语言的那些秘密之---函数返回局部变量
- C语言:断言,指针的算数运算
- C编译器剖析_3.2 语法分析_C语言的语句
- C语言基本运算
- 简单的C语言语法-scanf
- c语言 大数运算 加,减,乘,除,取整,取余,大小判断,流输入,流输出
- C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com