Является ли ({заявления;}; условие; {заявления;}) законным C? - PullRequest
5 голосов
/ 04 октября 2010

Несмотря на плохой стиль, законно ли C иметь цикл for с фигурными скобками в скобках? Как это:

char *a = "a ";
char *b = "b ";

for ( { int aComesFirst = 1;
        char *first = a;
        char *second = b;
      };
      aComesFirst >= 0;
      { aComesFirst--;
        swap(first, second);
      } )
{
  printf("%s%s\n", first, second);
}

Если что-то в этом духе возможно, я должен ставить точку с запятой после первых закрывающих скобок или это добавит пустое выражение?

Я понимаю, что стилистически лучше переместить объявления char* вне цикла for и swap в конец внутренней части цикла. Но стиль не в этом вопросе, я просто хочу знать, возможно ли установить скобки в скобках.

Ответы [ 6 ]

9 голосов
/ 04 октября 2010

Я уже отвечал на это раньше… это легко сделать легальным в C или C ++, добавив локальный тип struct. Это вообще плохой стиль, хотя.

char *a = "a ";
char *b = "b ";

for ( struct loopy {
        int aComesFirst;
        char *first;
        char *second;
      } l = { 1, a, b }; /* define, initialize structure object */

      l.aComesFirst >= 0; /* loop condition */

      l.aComesFirst--, /* loop advance */
      swap(l.first, l.second)
    )
{
  printf("%s%s\n", l.first, l.second);
}
6 голосов
/ 04 октября 2010

Нет, это недопустимо, но вы можете использовать запятые, чтобы получить половину пути:

for (int a = 1, b = 2; a < 10; ++a, ++b)

Вы не можете объявлять несколько переменных разных типов, и вы не можете использовать управляющие структуры впоследний бит, но в большинстве случаев достаточно хорош* оператор , который может использоваться в любом месте для вычисления левого операнда, за которым следует правый операнд, и возвращает результат правого выражения, то есть a, b == b, a, b, c == c и т. д.

3 голосов
/ 04 октября 2010

Нет, это не законно. Если бы это было допустимо, код все равно не работал бы, потому что c имеет область действия уровня блока, поэтому у вас не будет доступа к переменным, определенным в фигурных скобках.

2 голосов
/ 04 октября 2010

Это не законно, но это:

for(i = 0, j = 10; i < 10; i++, j--)
{
  // ..
}

См .: оператор запятой

1 голос
/ 04 октября 2010

Используете ли вы gcc с выражениями операторов? http://tigcc.ticalc.org/doc/gnuexts.html#SEC63 Может быть, это заставит этот тип кода работать. кроме этого (int i = { stmts; }; { stmts; bool}; { ... })

0 голосов
/ 04 октября 2010

Стандарт гласит (6.8.5.3/1)

для оператора (clause-1; expr-2; expr-3)

Я довольноуверен, что ни expr-2, ни expr-3 не может быть заменено чем-то не выражением ( блок не является выражением ), и я уверен, что clause-1 также не может быть заменено оператором.1012 *

...