这三元是否有条件?:正确(Objective)C语法?

时间:2012-01-06 15:56:08

标签: objective-c c ternary-operator conditional-operator

我不认为这是可能的,但显然在目标C中是允许的:

int a = b ?: c;

所以你看到他们在这里做了什么,他们忽略了三元表达式的第二部分,这样如果b非零,则b用作第二部分。

它很聪明但据我所知这是针对K& R C,可能是ANSI C。

如果没有,多年来我一直错过了一个非常聪明的语法技巧......唉!

更新: 这是gcc。

4 个答案:

答案 0 :(得分:69)

来自http://en.wikipedia.org/wiki/%3F%3A

  

C的GNU扩展允许省略第二个操作数,并且隐式地使用第一个操作数作为第二个操作数:

a = x ? : y;
     

表达式相当于

a = x ? x : y;
     

除了如果x是表达式,它只被评估一次。如果评估表达具有副作用,则差异很大。

答案 1 :(得分:6)

此行为是为gccclang定义的。如果您正在构建Mac OS X或iOS代码,则没有理由不使用它。

我不会在便携式代码中使用它,但不仔细考虑它。

答案 2 :(得分:1)

这是GNU C extension。检查编译器设置(查找C flavor)。不确定它是否是Clang的一部分,我能得到的唯一信息是this page

  

简介

     

本文档描述了Clang提供的语言扩展。除了此处列出的语言扩展,Clang还旨在支持广泛的GCC扩展。有关这些扩展的更多信息,请参阅GCC手册。

答案 3 :(得分:1)

$ cat > foo.c
#include <stdio.h>

int main(int argc, char **argv)
{
  int b = 2;
  int c = 4;
  int a = b ?: c;
  printf("a: %d\n", a);
  return 0;
}
$ gcc -pedantic -Wall foo.c
foo.c: In function ‘main’:
foo.c:7: warning: ISO C forbids omitting the middle term of a ?: expression

所以不,这是不允许的。 gcc在这种情况下发出的是:

$ ./a.out 
a: 2

所以未定义的行为就是按照你在问题中所说的做的,即使你不想依赖它。