这是三元条件吗?:正确(客观)的C语法?

问题描述 投票:39回答:4

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

int a = b ?: c;

因此,您在这里看到他们在做什么,他们正在省略三元表达式的第二部分,因此,如果b为非零,则将b用作第二部分。

这很聪明,但据我所知,这与K&R C以及ANSI C背道而驰。

如果没有,那么多年来,我一直在一个非常聪明的语法技巧中迷失了……ala!

更新:它是gcc。

objective-c c ternary-operator conditional-operator
4个回答
73
投票

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

C的GNU扩展允许省略第二个操作数,也隐式地将第一个操作数用作第二个操作数:

a = x ? : y;

表达式等于

a = x ? x : y;

除了x是表达式之外,它仅被评估一次。如果评估表达具有副作用,则差异是显着的。


6
投票

gccclang都定义了此行为。如果您要构建macOS或iOS代码,则没有理由not使用它。

但是,如果没有仔细考虑,我不会在可移植代码中使用它。


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

因此,不确定的行为正在执行您在问题中所说的,即使您不想依靠它。


1
投票

这是GNU C extension。检查您的编译器设置(寻找C风格)。不知道它是否是Clang的一部分,我唯一可以获得的信息是在this page

简介

本文档介绍了Clang提供的语言扩展。除了此处列出的语言扩展之外,Clang还旨在支持各种GCC扩展。有关这些扩展的更多信息,请参见GCC手册。

© www.soinside.com 2019 - 2024. All rights reserved.