Привет! У меня элементарный вопрос по языку C, словами задачу можно описать так: "Есть 2 несовместных условия (X и Y) и три блока команд (A, B, C), нужно выполнить A в обоих случаях, а также B в первом и C во втором. Порядок выполнения не важен".
Как я хочу заставить действовать программуПроверить X и YЕсли верно X, то выполнить A и BЕсли верно Y, то выполнить A и CКод, один из вариантов:
if(X || Y) {A; if(X) B; else C;}
Однако мне не нравится, что условие X проверяется 2 раза вместо одного. Недостаточно красиво, ну и вроде как лишняя работа.
Я захотел это исправить! Но смог, используя только инструкции GOTO. Как это сделать без них? И возможно ли?
Сразу замечу, что мой вопрос именно по синтаксису языка, а не по оптимизации, которой тут и не пахнет.
Вариант с GOTO. Он описывает в полной мере то, как я хочу видеть работу программы, однако
ну это же GOTO if(X) goto labelX; else if(Y) goto labelY
...
labelX: B; goto label;
labelY: C; goto label;
label: A;
По сути, я хочу избавиться от GOTO в этом коде, сохранив его лаконичность (нигде ничего не написано по 2 раза).
Какие варианты не принимаются:
if(X) B; else if(Y) C;
A;
Потому что кроме X и Y могут быть и другие возможности, при которых не должно выполняться A. Код должен быть полностью контекстно-свободным.
if(X) {A; B;} else if(Y) {A; C;}
Потому что код A повторён 2 раза.
А также варианты с флагами! И прочие навороты. Моя цель - упростить самый первый отрывок кода, а не усложнить.
Возможно, ключ кроется в switch-case? Тем более, что C позволяет не писать break там, где не надо. У меня не получилось.
В общем, я в догадках. Неужели нельзя обойтись без GOTO?
P.S. Для того, чтобы придать задаче хоть какую-то мнимую практическую ценность, предлагаю положить, что A, B, C - большие куски кода, которые тем не менее нельзя засунуть в функцию (много локальных переменных и вообще непрактично). А условия X и Y очень долго вычисляются. И закэшировать значения X и Y мы не можем тоже. Такая вот сферическая программа в вакууме.