没有第二个操作数的三元运算符
Ternary operator without second operand
这是一个两条腿的问题:一条针对 C,一条针对 C++。
C 和 C++ 标准对以下三元 (?:
) 运算符的使用有何规定:
const char* opt = /* possible NULL pointer */;
const char* str = opt ?: "";
什么时候合法的?它是编译器扩展吗?对第一个操作数有什么要求(隐式转换为bool
/int
)?
省略中间操作数的三元运算符:
const char* str = opt ?: "";
是 GNU 扩展,它不是标准的 C++。
GCC 将此作为 extension 提供。这不在 C++ 标准中。
语义是如果条件不为零,表达式的值就是条件的值。
隐含的要求是条件必须 type-compatible 与第三个操作数,即可以按照通常的条件运算符规则将一个转换为另一个。
请务必注意,如果条件是根据具有副作用的函数计算的,则该值将不会使用此扩展重新计算:
opt() ?: ""; //opt called once
opt() ? opt() : ""; //opt called twice
这是一个两条腿的问题:一条针对 C,一条针对 C++。
C 和 C++ 标准对以下三元 (?:
) 运算符的使用有何规定:
const char* opt = /* possible NULL pointer */;
const char* str = opt ?: "";
什么时候合法的?它是编译器扩展吗?对第一个操作数有什么要求(隐式转换为bool
/int
)?
省略中间操作数的三元运算符:
const char* str = opt ?: "";
是 GNU 扩展,它不是标准的 C++。
GCC 将此作为 extension 提供。这不在 C++ 标准中。
语义是如果条件不为零,表达式的值就是条件的值。
隐含的要求是条件必须 type-compatible 与第三个操作数,即可以按照通常的条件运算符规则将一个转换为另一个。
请务必注意,如果条件是根据具有副作用的函数计算的,则该值将不会使用此扩展重新计算:
opt() ?: ""; //opt called once
opt() ? opt() : ""; //opt called twice