Можно ли иметь операторы внутри тернарного оператора (в сгенерированном коде)? - PullRequest
2 голосов
/ 16 мая 2019

Отказ от ответственности: я не пишу такой код, я знаю, что он ужасен и нечитаем.

Я генерирую C, и мне нужно, чтобы все было в одном выражении.

Это работает:

#define true 1
int a  = (true) ? ( (true) ? (puts("a"), puts("b"),  1) : (2) ) : (3);
printf("%d\n", a);
a
b
1

Но мне также нужны заявления, а не только выражения. Это не компилируется:

int a  = (true) ? ( (true) ? (puts("a"), puts("b"), (if (true) puts("c");),  1) : (2) ) : (3);
error: expected expression

Разве невозможно достичь в C?

Ответы [ 2 ]

4 голосов
/ 16 мая 2019

Используя расширение gcc , вы можете обернуть операторы в фигурные скобки, например

int a  = (true) ? ( (true) ? (puts("a"), puts("b"), ({if (true) puts("c");}),  1) : (2) ) : (3);
3 голосов
/ 16 мая 2019

Вы не можете иметь выражения внутри выражения, нет.Однако, как вы заметили, у вас могут быть логические операторы и троичные операторы.

if (true) puts("c");

можно записать в выражении, например

true ? puts("c") : false

или

true && puts("c")
...