Каковы типичные применения нулевого оператора
;
в C?
Я знаю, что он в основном используется для пропуска выражения, ожидаемого компилятором, но здесь меня интересуют только примеры реальных случаев использования.
Каковы типичные применения нулевого оператора
;
в C?
Я знаю, что он в основном используется для пропуска выражения, ожидаемого компилятором, но здесь меня интересуют только примеры реальных случаев использования.
Обычно это побочный эффект блока кода, который был лишен препроцессором, например
#if DEBUG
#define ASSERT(_x) Assert(_x)
#else
#define ASSERT(_x)
#endif
ASSERT(test); // Results in null statement in non-debug builds
Это или в циклах, где ваше состояние уже содержит все, что необходимо сделать на каждой итерации.
while (*(dst++) = *(src++))
;
После метки в конце функции (точнее, в конце любого блока), например
void foo(void)
{
// ...
exit:
;
}
while (somethingWithSideEffects()) ;
Я использовал его, хотя и редко, в возможно необычной ситуации (и в том, что некоторые или многие люди ошибаются). Мне приходилось иногда писать очень сложное условие if
без предложения else
, где условие if должно быть отменено. Очевидно, это может быть примерно так:
if ( !( overly complex condition ) )
{
do stuff
}
Иногда имеет смысл (по крайней мере, мне) думать об этом с точки зрения позитивной логики. Другими словами, если overly complex condition
имеет значение true, я не хочу, чтобы код запускался. Поэтому я вместо этого написал это как:
if ( overly complex condition )
; // do nothing
else
{
do stuff
}
Пример:
while (!kbhit())
;
Должно быть понятно.
Я могу придумать валидацию scanf
. scanf
застревает, когда пользователь не дал правильный ввод. Таким образом, чтобы предотвратить scanf
от застревания, символы до конца строки должны быть удалены.
if( scanf("%d",&integer) == 0 )
{
while( getchar() != '\n' ) ;
// ....
}
Несколько необычное использование - но для которого я действительно ценю существование пустого оператора - это когда у меня есть два условия и два действия, которые я нахожу наиболее естественным образом выразить так:
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
заявления, как известно, также склонны к чрезмерному усложнению и запутыванию. Поэтому я часто предпочитаю первую версию с нулевым утверждением.
Единственное, что я могу придумать, это:
1- В конце цикла, где операции уже закодированы в операторах цикла. например while(a[i--]);
2- В конце метки, где операция не требуется. например Label: ;
Модульные тесты для совместимого компилятора.
Это скорее нулевое выражение, чем нулевой оператор, но оно часто встречается в циклах.
for (;;) // Loop "forever"
for (int i=10; i--; ) // 9..0
и т.д.
Мне было интересно, как написать нулевое выражение в строку, если и придумал это. он компилируется и работает.
condition ? x = 1 : "do nothing";
забавные вещи.
Пример нулевого оператора:
для (;;);