{…}, в то время как (0) — что это хорошо для? [дубликат]

312
задан Community 23 May 2017 в 00:31
поделиться

4 ответа

Это - единственная конструкция в C, который можно использовать для #define составная операция, поместить точку с запятой после, и все еще использовать в if оператор. Пример мог бы помочь:

#define FOO(x) foo(x); bar(x)

if (condition)
    FOO(x);
else // syntax error here
    ...;

Даже фигурные скобки использования не помогает:

#define FOO(x) { foo(x); bar(x); }

Используя это в if оператор потребовал бы, чтобы Вы опустили точку с запятой, которая парадоксальна:

if (condition)
    FOO(x)
else
    ...

, Если Вы определяете НЕЧТО как это:

#define FOO(x) do { foo(x); bar(x); } while (0)

тогда следующее синтаксически корректно:

if (condition)
    FOO(x);
else
    ....
463
ответ дан Greg Hewgill 23 November 2019 в 01:10
поделиться

Это - способ упростить проверку ошибок и избежать глубоко вложенного if's. Например:

do {
  // do something
  if (error) {
    break;
  }
  // do something else
  if (error) {
    break;
  }
  // etc..
} while (0);
105
ответ дан nickf 23 November 2019 в 01:10
поделиться

Это помогает группировке нескольких операторов в единственный, так, чтобы подобный функции макрос мог на самом деле использоваться в качестве функции. Предположим, что Вы имеете

#define FOO(n)   foo(n);bar(n)

, и Вы делаете

void foobar(int n){
  if (n)
     FOO(n);
}

тогда, это расширяется до

void foobar(int n){
  if (n)
     foo(n);bar(n);
}

Уведомление, что второй вызов (панель (n)) не является частью если оператор больше.

Обертка оба в делают {}, в то время как (0), и можно также использовать макрос в если оператор.

76
ответ дан Dawid Ferenczy Rogožan 23 November 2019 в 01:10
поделиться

В общем, do / while хорошо для любого вида конструкции цикла, где нужно выполнить цикл [по крайней мере 115] однажды. Возможно эмулировать этот вид цикличного выполнения или через прямое while или через даже for цикл, но часто результат немного менее изящен. Я признаю, что определенные приложения этого шаблона довольно редки, но они действительно существуют. Тот, который приходит на ум, является основанным на меню консольным приложением:

do {
    char c = read_input();

    process_input(c);
} while (c != 'Q');
-4
ответ дан Daniel Spiewak 23 November 2019 в 01:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: