2010-02-16 6 views
2

Учитывая этот цикл, почему в конце есть точка с запятой?Не понимаю этот синтаксис

for(s = string; *s == ' '; s++) 
    ; 

благодаря

редактировать * так же можно изменить эту процедуру так, чтобы она начинается в конце строки и проверяет пространство и уменьшается до тех пор, пока не найдет charachter?

+0

изменить его на использование ++ s - у него есть потенциал для создания лучшего кода. –

+4

Зачем это сделать код лучше? В этом примере это будет то же самое. – Marius

+0

Это было бы так, если у вас есть компилятор, который имеет правильную оптимизацию (что больше всего делает, следовательно, слово «потенциал»). Рекомендуется использовать pre-incrememnt, если не требуется post-increment - оптимизация обычно не применяется к не встроенным типам. –

ответ

0

Это заставляет петлю ничего не делать. Все, что происходит, это то, что указатель продвинут.

3

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

3

Точка с запятой делает пустой оператор в цикле. Этот цикл ищет первый непустой char в string.

6

Это пустое заявление, которое является не-оп в C. Это как если бы вы сказали:

for(s = string; *s == ' '; s++) 
{ 
    // do nothing 
} 

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

+0

Я не понимаю, почему это не было принято в качестве ответа через 6 лет. –

0

Должно быть утверждение или блок как «тело» цикла for. Это то, что выполняется каждый раз через цикл (пока s все еще указывает на пробел).

точкой с запятой по себе это утверждение пустой - то есть, ничего не происходит в теле цикла, только s++ на линии в for цикла.

1

Потому что в C (и другие) для грамматики: для (INIT; условие; шаг) тела

Где тело может быть замыкание (блок кода в {}), но тело может также быть пустым;

1

Я хотел бы отметить, что цикл может быть записан так, чтобы сделать его более явным то, что происходит и увеличить читаемость:

for(s = string; *s == ' ';) 
    s++; 

Или используя время цикла:

s = string; 
while(*s == ' ') 
    s++; 

Но я думаю, что первый подход с пустым телом более «c-идиоматический» (и труднее читать).

+0

Увеличение читаемости только в ваших глазах , ИМХО.Тот факт, что исходная форма является идиоматичной, позволяет читателям C программировать их легко. – 2010-02-16 09:59:04

+0

хорошо, * только * причина, о котором мы говорим, потому что у ОП была проблема с пониманием этого ... –