最近在看GPIO驱动框架中关于label属性的show方法函数时遇到了三目运算符“?:”省略操作数的情况,因为不多见在此记录下,不多说直接贴代码:
static ssize_t chip_label_show(struct device *dev,
struct device_attribute *attr, char *buf)
{
const struct gpio_chip *chip = dev_get_drvdata(dev);
return sprintf(buf, "%s\n", chip->label ? : "");
}
可以看到在上面 chip->label ? : “”,猜想X?:Y是X?X:Y的缩写,经过测试后发现确实是这样。
形如 a > b ?: b 中间省略了什么呢,是a吗?验证之后发现并不是a其实省略了 a > b,也就是说 a > b ?: b 等价于 a > b ? a > b : b,那么可以这样下结论:“?:” 中间省略的东东是与 “?”之前的数或者表达式完全一致。
值得注意的是:在某种情况下,还是会有出入的
譬如 y = ++x ? ++x : 3 与 y = ++x ?: 3
输出的y的结果是不一样的,这是为什么呢?
当x的初始值为0时,第一种写法的输出y的结果为2 ,而第二种写法的输出y的结果为1
说明第一种写法输出的是执行了两次++操作的结果,而第二种写法只执行了一次++操作,所以当有++或–运算的时候,要根据需要判断要不要省略,不能贸然省去,从而引起不必要的错误。
其实这种省略方式还是挺好的,特别是代码长度比较长的时候,可以在满足要求的前提下简化代码。