Is this ternary conditional ?: correct (Objective) C syntax?

Solution 1:

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.

Solution 2:

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

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

Solution 3:

$ 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.

Solution 4:

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.