我不认为这是可能的,但显然在目标C中允许:
int a = b ?: c;
因此,您在这里看到他们在做什么,他们正在省略三元表达式的第二部分,因此,如果b为非零,则将b用作第二部分。
这很聪明,但据我所知,这与K&R C以及ANSI C背道而驰。
如果没有,那么多年来,我一直在一个非常聪明的语法技巧中迷失了……ala!
更新:它是gcc。
来自http://en.wikipedia.org/wiki/%3F%3A
C的GNU扩展允许省略第二个操作数,也隐式地将第一个操作数用作第二个操作数:
a = x ? : y;
表达式等于
a = x ? x : y;
除了x是表达式之外,它仅被评估一次。如果评估表达具有副作用,则差异是显着的。
gcc
和clang
都定义了此行为。如果您要构建macOS或iOS代码,则没有理由not使用它。
但是,如果没有仔细考虑,我不会在可移植代码中使用它。
$ 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
因此,不确定的行为正在执行您在问题中所说的,即使您不想依靠它。
这是GNU C extension。检查您的编译器设置(寻找C风格)。不知道它是否是Clang的一部分,我唯一可以获得的信息是在this page:
简介
本文档介绍了Clang提供的语言扩展。除了此处列出的语言扩展之外,Clang还旨在支持各种GCC扩展。有关这些扩展的更多信息,请参见GCC手册。