Есть ли разница между этими двумя циклами? - PullRequest
0 голосов
/ 30 марта 2010
while ((R_SPI2SR & B_SPIF) != B_SPIF)
{
    SERIAL_SERVICE_WDOG;
};


while ((R_SPI2SR & B_SPIF) != B_SPIF)
{
    SERIAL_SERVICE_WDOG;
}

Мне нравится знать, с какой целью ставить точку с запятой ..

Ответы [ 3 ]

6 голосов
/ 30 марта 2010

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

5 голосов
/ 30 марта 2010

Оператор, выполняемый циклом while, является составным оператором внутри фигурных скобок. Точка с запятой - это просто пустое утверждение. Вы могли бы написать этот цикл как:

while ((R_SPI2SR & B_SPIF) != B_SPIF)
    SERIAL_SERVICE_WDOG;

, поскольку составной оператор содержит только один оператор или как

while ((R_SPI2SR & B_SPIF) != B_SPIF)
{
    SERIAL_SERVICE_WDOG;;;;;;;;;;;;;;;
};;;;;;;;;;;;;;   

что, конечно, ужасный стиль.

Пустой оператор используется, когда у вас есть цикл, который не нуждается в теле.

/* Throw away remaining characters up to the end of line. */
while ( ( c = getchar() ) != '\n')
   ;

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

int i = 1;
int j = 1;
while ( i < 10 );    /* The semicolon here ends the loop... */
    j *= i++;        /* ... so this statement is only executed once. */

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

3 голосов
/ 30 марта 2010

единственное отличие в коде - это дополнительная точка с запятой. но скомпилированная сборка такая же.

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