Использование нулевого оператора в C - PullRequest
24 голосов
/ 08 апреля 2011

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

;

в C?

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

Ответы [ 12 ]

23 голосов
/ 08 апреля 2011

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

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


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

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

18 голосов
/ 08 апреля 2011
while (*(dst++) = *(src++))
    ;
15 голосов
/ 08 апреля 2011

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

void foo(void)
{
    // ...

exit:
    ;
}
5 голосов
/ 08 апреля 2011
while (somethingWithSideEffects()) ;
4 голосов
/ 08 апреля 2011

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

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

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

if ( overly complex condition )
  ;  // do nothing
else
  {
  do stuff
  }  
2 голосов
/ 17 октября 2018

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

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 операторы, как известно, также склонны к чрезмерному усложнению и запутыванию. Поэтому я часто предпочитаю первую версию с нулевым оператором.

2 голосов
/ 08 апреля 2011

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

if( scanf("%d",&integer) == 0 )
{
    while( getchar() != '\n' ) ;
    // ....
}
2 голосов
/ 08 апреля 2011

Пример:

 while (!kbhit())
     ;

Должен быть самоочевидным.

1 голос
/ 08 апреля 2011

Единственное использование, которое я могу придумать:

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

2- В конце метки, где не нужно выполнять никаких операций.например, Label: ;

0 голосов
/ 12 июня 2019

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

condition ? x = 1 : "do nothing";

прикольные вещи.

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