Подтвердить что ты не робот

Является ли этот тернарный условный?: Правильный (объективный) синтаксис C?

Я не думал, что это возможно, но, видимо, в Objective C разрешено:

int a = b ?: c;

Итак, вы видите, что они здесь делают, они упускают вторую часть тернарного выражения, так что если b отличен от нуля, b используется как вторая часть.

Это умно, но насколько я знаю, это против K & R C и, возможно, ANSI C.

Если нет, я пропустил ужасно умный синтаксический трюк в течение многих лет... увы!

Обновление: Это gcc.

4b9b3361

Ответ 1

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

Расширение GNU для C позволяет исключить второй операнд и использовать неявный первый операнд как второй:

a = x ? : y;

Выражение эквивалентно

a = x ? x : y;

за исключением того, что если x является выражением, оно оценивается только один раз. Разница существенна, если оценка выражения имеет побочные эффекты.

Ответ 2

Это поведение определено как для gcc, так и для clang. Если вы создаете код Mac OS X или iOS, нет причин не использовать его.

Я бы не использовал его в переносном коде, но, не внимательно его рассматривая.

Ответ 3

Это расширение расширение GNU C. Проверьте настройки компилятора (посмотрите на вкус C). Не уверен, что это часть Clang, единственная информация, которую я могу получить, находится в этой странице:

Введение

В этом документе описываются расширения языка, предоставляемые Clang. В дополнение к перечисленным здесь языковым расширениям, Clang стремится поддерживать широкий диапазон расширений GCC. Дополнительную информацию об этих расширениях см. В руководстве GCC.

Ответ 4

$ 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

Таким образом, поведение undefined делает то, что вы говорите в своем вопросе, даже если вы не хотите полагаться на это.