странный токен в: for (; max! = 0; max / = 10, pow10 * = 10) - PullRequest
1 голос
/ 13 марта 2012
for(; max != 0 ; max/=10, pow10*=10)

Вытащил этот отрывок из вики-страницы на "Radix sort".Я не видел цикл, который начинается с точки с запятой, как это раньше.Компилятор не уловил это, таким образом, я предполагаю, что это законно.Кто-нибудь может объяснить?

Кроме того, так как я писал только довольно простые циклы, я не понимал, что можно сделать несколько назначений (правильное слово?), Например, "max / = 10, pow10 * = 10" вконец оператора for () ... Есть ли ограничения для этого?Плохая форма?

Спасибо, ребята!(и извините за мой потенциально неправильный словарный запас ... рано, мне нужно больше кофе ...)

Ответы [ 6 ]

4 голосов
/ 13 марта 2012

Это совершенно законно. Это цикл for с пустым блоком инициализации.

Самый типичный цикл for выглядит примерно так:

for (int i = 0; i < size; i++) {
  ...
}

Это (почти) эквивалентно следующему:

int i = 0;
for ( ; i < size; ) {
  ...
  i++;
}

(За исключением того, что в первом случае область действия i ограничена внутри цикла, в то время как во втором случае i все еще видна после цикла, поскольку его область действия включает в себя блок.)

Для циклов есть три блока, разделенных точками с запятой: инициализация , условие цикла и приращение цикла . Любой или все они могут быть пустыми. Так что это тоже законно (в результате получается бесконечный цикл):

for(;;)
3 голосов
/ 13 марта 2012

Я не видел цикл, который начинается с такой точки с запятой, как этот.

Это просто означает, что предложение initializer является пустым выражением - ничего не делается до первой итерации. Другие два предложения также можно оставить пустыми, если цикл, который вы пишете, не нуждается в них. Например, for (;;) будет зацикливаться вечно, если в нем нет break, return, throw или goto.

Есть ли предел этому? Плохая форма?

«Оператор запятой» может использоваться для оценки нескольких выражений, подобных этому; их может быть сколько угодно, и они будут оцениваться по порядку. Часто считается, что лучше использовать несколько операторов, за исключением случаев, когда возможен только один оператор.

1 голос
/ 13 марта 2012

Цикл for содержит три элемента, разделенных точкой с запятой, все необязательно.

  1. Оператор для начала цикла
  2. Условие, чтобы оставаться в цикле
  3. Оператор для выполнения после каждой итерации цикла.

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

В последней части они используют оператор запятой C / C ++: оператор запятой означает выполнение обоих операторов и возврат последнего.Например, int x = 4,5; совпадает с int x = 5;.Вы можете использовать это для запуска нескольких операторов, где обычно разрешен только один.Цикл for, который вы перечислили, является одним из примеров, или вы могли бы сделать что-то подобное с if операторами.

char* s;
int compare;

if(s == NULL)
    ...
else if(compare = strcmp(s, otherString), compare < 0)
    ...
else if(compare > 0)
    ...

Это иногда более читабельно, чем это:

if(s == NULL)
    ...
else
{
    compare = strcmp(s, otherString);
    if(compare < 0)
        ....
    else if(compare > 0)
        ....
}
1 голос
/ 13 марта 2012

Для второй части вашего вопроса вы можете выполнить несколько операторов, используя comma operator. Прочитайте http://en.wikipedia.org/wiki/Comma_operator для получения дополнительной информации.

0 голосов
/ 13 марта 2012

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

В этом случае причина в другом. Цикл использует 2 переменных, max и pow10. Однако цикл for допускает ноль или одно объявление. По стилистическим соображениям кодеры размещают оба объявления в одном и том же месте непосредственно перед циклом for.

0 голосов
/ 13 марта 2012

Это просто пустой блок инициализации. Вы можете пропустить любую часть цикла for, если там ничего не нужно делать (например, for(;;) - это бесконечный цикл без инициализации и эпилога).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...