?:在目标C中

Lea*_*cim 13 objective-c ios

这个 iOS教程中,有一行代码?后跟一个:.在代码注释的上下文中,我认为它是某种三元操作,然而,这显然不是三元运算符的语法.这个代码中有什么名称?:

// Initialize the list of weather items if it doesn't exist
NSMutableArray *array = self.xmlWeather[@"weather"] ?: [NSMutableArray array];
Run Code Online (Sandbox Code Playgroud)

Car*_*rum 29

这是GCC扩展:

6.7具有省略操作数的条件

可以省略条件表达式中的中间操作数.然后,如果第一个操作数非零,则其值为条件表达式的值.

因此,表达

x ? : y
Run Code Online (Sandbox Code Playgroud)

具有xif非零的值; 否则,价值y.

这个例子完全等同于

x ? x : y
Run Code Online (Sandbox Code Playgroud)

在这个简单的例子中,省略中间操作数的能力并不是特别有用.当它变得有用时是第一个操作数,或者可能(如果它是一个宏参数),包含副作用.然后在中间重复操作数将执行两次副作用.省略中间操作数使用已经计算的值而没有重新计算它的不良影响.