C条件运算符('?')与空的第二个参数
典型的'?' 运算符以下面的forms使用:
A ? B : C
然而,在B = AI的情况下,已经看到下面的缩写
A ? : C
这令人惊讶的作品。 (风格明智的)离开第二个参数是更好的,还是他们的机会,某些编译器将无法处理?
C语言是不允许的(据我所知),但编译器如gcc的快捷键是?:c作为扩展名 。 a?:c
含义与a?a:c
。
它是一个gcc的扩展
条件与省略的操作数
x ? : y
x ? : y
相当于x ? x : y
x ? x : y
除非我错误,否则你使用的是编译器扩展(猜测,gcc)。 我敢肯定,标准不允许你省略三元运算符的第二个操作数。
我填写一下。
该标准使用术语条件运算符 。
句法 条件expression式: 逻辑或expression 逻辑或expression式 ? expression式:conditional-expression
条件expression式不会产生左值。 也; 维基百科; 条件
注:即:C ++有:
逻辑或expression式? expression式: 赋值expression式
约束: *第一个操作数应该有标量types[1] 。 *以下其中一项应为第二和第三个操作数: - 两个操作数都有算术types[2] ; - 两个操作数具有相同的结构[3]或联合types[4] ; - 两个操作数都有voidtypes[5] ; - 两个操作数都是指向兼容的合格或不合格[6]版本的指针 types[7] ; - 一个操作数是一个指针,另一个是空指针常量[8] ; 要么 - 一个操作数是指向一个对象或不完整types[9]的指针 是指向合格或不合格版本的void的指针。
足部食物:
标量types:算术types和指针types。 [2]算术types:整型和浮点型。 [3]结构types:一个顺序分配的非空集合对象(和,in 某些情况下,一个不完整的数组),每一个都有一个 可选的指定名称和可能的不同types。 联合types:一组重叠的非空成员对象,每一个都有 一个可选的指定名称和可能不同的types。 [5]虚空types:一组空值; 这是一个不完整的types,不能 完成。 [6]合格types:1998年(常数和易变),1999年(限制) 2011(_Atomic)。 * [7]兼容types:它们的types是相同的。 [8]空ptr。 常数:NULL; 实现定义的空指针常量。 [9]不完整的types:描述对象的types,但缺乏需要确定的信息 他们的大小。
* 在C中input限定符
所以:不明智的使用。
我在网上做了一些调查,根据维基百科,这种行为得到了C的GNU扩展的支持。http: //en.wikipedia.org/wiki/%3F:#C
所以其他编译器很可能认为这是非法的。 顺便说一句,这个操作符被称为三元条件,所以你可以浏览它。
编辑:
我检查了gcc和苹果llvm,它工作正常。
最好留下第二个参数。如果B有变化,你可能不记得修改上面的语句。 此外,如果您将B从声明中删除,其他人可能会很难阅读您的代码并改进它。