Is this ternary conditional ?: correct (Objective)

2019-01-14 05:43发布

I didn't think this was possible but apparently in Objective C it is allowed:

int a = b ?: c;

So you see what they're doing here, they're leaving out the second part of the ternary expression, such that if b is nonzero, b is used as the second part.

It's clever but as far as I know this is against K&R C, and probably ANSI C.

If not, I've been missing out of a terribly clever syntax trick for years...alas!

Update: It is gcc.

4条回答
成全新的幸福
2楼-- · 2019-01-14 06:04

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

A GNU extension to C allows omitting the second operand, and using implicitly the first operand as the second also:

a = x ? : y;

The expression is equivalent to

a = x ? x : y;

except that if x is an expression, it is evaluated only once. The difference is significant if evaluating the expression has side effects.

查看更多
叛逆
3楼-- · 2019-01-14 06:08

This is a GNU C extension. Check you compiler settings (look for C flavor). Not sure if it's part of Clang, the only information I could get is in this page:

Introduction

This document describes the language extensions provided by Clang. In addition to the language extensions listed here, Clang aims to support a broad range of GCC extensions. Please see the GCC manual for more information on these extensions.

查看更多
爷、活的狠高调
4楼-- · 2019-01-14 06:18
$ 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

So no, it's not allowed. What gcc emits in this case does this:

$ ./a.out 
a: 2

So the undefined behaviour is doing what you say in your question, even though you don't want to rely on that.

查看更多
家丑人穷心不美
5楼-- · 2019-01-14 06:26

This behaviour is defined for both gcc and clang. If you're building Mac OS X or iOS code, there's no reason not to use it.

I would not use it in portable code, though, without carefully considering it.

查看更多
登录 后发表回答