没有第二个操作数的三元运算符

时间:2016-01-08 14:45:21

标签: c++ c gcc operators conditional-operator

这是一个两条腿的问题:一个用于C,一个用于C ++。

关于以下三元(?:)运算符的使用,C和C ++标准有什么说法:

const char* opt = /* possible NULL pointer */;
const char* str = opt ?: "";

什么时候合法?它是编译器扩展吗?对第一个操作数有什么要求(可以隐式转换为bool / int)?

2 个答案:

答案 0 :(得分:21)

GCC将其作为extension提供。这不符合C ++标准。

语义是如果条件非零,则表达式的值是条件的值。

隐式要求是条件必须与第三个操作数类型兼容,即一个可以按照通常的条件运算符规则转换为另一个。

重要的是要注意,如果条件是从具有副作用的函数计算的,那么的值将使用此扩展名重新计算:

opt() ?: ""; //opt called once
opt() ? opt() : ""; //opt called twice

答案 1 :(得分:10)

省略中间操作数的三元运算符:

const char* str = opt ?: "";

是一个GNU扩展,它不是标准的C ++。