Является ли этот тернарный условный?: Правильный (объективный) синтаксис C?
Я не думал, что это возможно, но, видимо, в Objective C разрешено:
int a = b ?: c;
Итак, вы видите, что они здесь делают, они упускают вторую часть тернарного выражения, так что если b отличен от нуля, b используется как вторая часть.
Это умно, но насколько я знаю, это против K & R C и, возможно, ANSI C.
Если нет, я пропустил ужасно умный синтаксический трюк в течение многих лет... увы!
Обновление:
Это gcc.
Ответы
Ответ 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 делает то, что вы говорите в своем вопросе, даже если вы не хотите полагаться на это.