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从声明中删除,其他人可能会很难阅读您的代码并改进它。