2010-10-03 3 views
5

Плохой стиль, несмотря на это, разрешен ли закон C для цикла с фигурными скобками внутри парен? Как это:Is for ({statements;}; condition; {statements;}) legal C?

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 до конца внутренней части контура. Но стиль не в этом вопросе, я просто хочу знать, возможно ли положить фигурные скобки внутри парнеров.

+0

Я полагаю, что эта ужасная вещь действительно компилируется? – naiad

+0

Нет, это не так. Это всего лишь пример формы ответа, который я ищу. – AlcubierreDrive

+0

Связанные: http://stackoverflow.com/questions/3348766/how-to-initialize-several-variables-in-a-for-loop-in-c –

ответ

9

Я ответил на это раньше ... это легко может быть легальным в 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); 
} 
+1

'struct loopy' Ах! +1 люблю тег; -1 Arrrgghhhh; результат +0 – pmg

+0

++ для взлома цикла в фактически работающий; единственный прямой ответ на мой вопрос. И да, это так же стильно, как колокольчик. – AlcubierreDrive

+0

Есть, вероятно, компиляторы, которые позволят вам опустить 'loopy' и' l', чтобы объявить анонимный объект анонимного типа, поэтому вы можете притвориться, что он не существует. – Potatoswatter

6

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

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

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

Если вы не знаете, запятая используется там не какой-то специальный синтаксис, который может быть использован только в for петлями, это общее operator, который можно использовать в любом месте, чтобы оценить левый операнд, а затем правый операнд, и вернуть результат правильного выражения, то есть a, b == b, и a, b, c == c и так далее.

+0

Спасибо! Я отвечу на ваш ответ через несколько минут, если это все же самое лучшее. – AlcubierreDrive

+0

... и, честно говоря, эквивалентная структура 'while' будет в любом случае более четкой.Если вы решили ограничить область охвата, просто используйте свободно стоящий блок '{}' вокруг цикла инициализации-кода-n-while. – dmckee

3

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

+2

Хорошая точка вокруг области уровня блока. – AlcubierreDrive

2

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

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

См: the comma operator

+0

++ для ссылки на «оператор запятой». Я не знал, что запятая была первоклассным и очень полезным оператором. – AlcubierreDrive

0

Стандарт говорит (6.8.5.3/1)

для (п-1, выраж-2, выраж-3) утверждение

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

+0

+1 для соответствующей цитаты и для того, чтобы противостоять тому, кто был идиотом. –

1

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

+0

++ Спасибо за то, что вы указали мне расширение выражений Statement. – AlcubierreDrive