这是一个两条腿的问题:一个用于C,一个用于C ++。
关于以下三元(?:
)运算符的使用,C和C ++标准有什么说法:
const char* opt = /* possible NULL pointer */;
const char* str = opt ?: "";
什么时候合法?它是编译器扩展吗?对第一个操作数有什么要求(可以隐式转换为bool
/ int
)?
答案 0 :(得分:21)
GCC将其作为extension提供。这不符合C ++标准。
语义是如果条件非零,则表达式的值是条件的值。
隐式要求是条件必须与第三个操作数类型兼容,即一个可以按照通常的条件运算符规则转换为另一个。
重要的是要注意,如果条件是从具有副作用的函数计算的,那么不的值将使用此扩展名重新计算:
opt() ?: ""; //opt called once
opt() ? opt() : ""; //opt called twice
答案 1 :(得分:10)
省略中间操作数的三元运算符:
const char* str = opt ?: "";
是一个GNU扩展,它不是标准的C ++。