我不认为这是可能的,但显然在目标C中是允许的:
int a = b ?: c;
所以你看到他们在这里做了什么,他们忽略了三元表达式的第二部分,这样如果b非零,则b用作第二部分。
它很聪明但据我所知这是针对K& R C,可能是ANSI C。
如果没有,多年来我一直错过了一个非常聪明的语法技巧......唉!
更新: 这是gcc。
答案 0 :(得分:69)
来自http://en.wikipedia.org/wiki/%3F%3A
C的GNU扩展允许省略第二个操作数,并且隐式地使用第一个操作数作为第二个操作数:
a = x ? : y;
表达式相当于
a = x ? x : y;
除了如果x是表达式,它只被评估一次。如果评估表达具有副作用,则差异很大。
答案 1 :(得分:6)
此行为是为gcc
和clang
定义的。如果您正在构建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
所以未定义的行为就是按照你在问题中所说的做的,即使你不想依赖它。