Подтвердить что ты не робот

Использование нулевого оператора в C

Каковы типичные применения нулевого оператора

;

в C?

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

4b9b3361

Ответ 1

Обычно это побочный эффект блока кода, который был лишен препроцессором, например

#if DEBUG
    #define ASSERT(_x) Assert(_x)
#else
    #define ASSERT(_x)
#endif


ASSERT(test);    // Results in null statement in non-debug builds

Это или в циклах, где ваше состояние уже содержит все, что необходимо сделать на каждой итерации.

Ответ 2

while (*(dst++) = *(src++))
    ;

Ответ 3

После метки в конце функции (точнее, в конце любого блока), например

void foo(void)
{
    // ...

exit:
    ;
}

Ответ 4

while (somethingWithSideEffects()) ;

Ответ 5

Я использовал его, хотя и редко, в возможно необычной ситуации (и в том, что некоторые или многие люди ошибаются). Мне приходилось иногда писать очень сложное условие if без предложения else, где условие if должно быть отменено. Очевидно, это может быть примерно так:

if ( !( overly complex condition ) )
  {
  do stuff
  }

Иногда имеет смысл (по крайней мере, мне) думать об этом с точки зрения позитивной логики. Другими словами, если overly complex condition имеет значение true, я не хочу, чтобы код запускался. Поэтому я вместо этого написал это как:

if ( overly complex condition )
  ;  // do nothing
else
  {
  do stuff
  }  

Ответ 6

Пример:

 while (!kbhit())
     ;

Должно быть понятно.

Ответ 7

Я могу придумать валидацию scanf. scanf застревает, когда пользователь не дал правильный ввод. Таким образом, чтобы предотвратить scanf от застревания, символы до конца строки должны быть удалены.

if( scanf("%d",&integer) == 0 )
{
    while( getchar() != '\n' ) ;
    // ....
}

Ответ 8

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

if(condition1)
     /* do nothing */ ;                                                      
else if(condition2)
     do_something;                                                           
else do_something_else;                                                      

Часто condition1 проверяет, что все в порядке, но если это не так, condition2 различает два различных действия исключения do_something и do_something_else.

Конечно, это не единственный способ выразить это. Можно было бы повторить condition1:

if(!condition1 && condition2)
    do_something;                                                           
else if(!condition1)
    do_something_else;

Но это кажется хуже, потому что оно повторяет condition1. Или можно использовать вложенные операторы if:

if(!condition1) {
    if(condition2)
         do_something;                                                   
    else do_something_else;                                              
}

Но, конечно же, вложенные, if заявления, как известно, также склонны к чрезмерному усложнению и запутыванию. Поэтому я часто предпочитаю первую версию с нулевым утверждением.

Ответ 9

Единственное, что я могу придумать, это:

1- В конце цикла, где операции уже закодированы в операторах цикла. например while(a[i--]);

2- В конце метки, где операция не требуется. например Label: ;

Ответ 10

Модульные тесты для совместимого компилятора.

Ответ 11

Это скорее нулевое выражение, чем нулевой оператор, но оно часто встречается в циклах.

for (;;)                 // Loop "forever"

for (int i=10; i--; )    // 9..0

и т.д.

Ответ 12

Мне было интересно, как написать нулевое выражение в строку, если и придумал это. он компилируется и работает.

condition ? x = 1 : "do nothing";

забавные вещи.

Ответ 13

Пример нулевого оператора:

для (;;);