Несколько объяснений. Первый - общий, второй - для макросов препроцессора C с параметрами:
Я видел, что это используется в простом C-коде. В принципе, это более безопасная версия goto, так как вы можете вырваться из нее, и вся память очищается должным образом.
Почему что-то goto
-подобно быть хорошим? Ну, если у вас есть код, в котором почти каждая строка может возвращать ошибку, но вам нужно реагировать на все одинаково (например, передав ошибку вашему вызывающему абоненту после очистки), обычно более читаемо, чтобы избежать if( error ) { /* cleanup and error string generation and return here */ }
, поскольку он избегает дублирования кода очистки.
Однако в C ++ у вас есть исключения + RAII для этой цели, поэтому я бы назвал это неправильным стилем кодирования.
Если вы забыли точку с запятой после функционального вызова макроса, аргументы могут быть сжаты нежелательным образом и скомпилированы в действительный синтаксис. Представьте себе макрос
#define PRINT_IF_DEBUGMODE_ON(msg) if( gDebugModeOn ) printf("foo");
. Это случайно называется
if( foo )
PRINT_IF_DEBUGMODE_ON("Hullo\n")
else
doSomethingElse();
. «Else» будет считаться связанным с gDebugModeOn
, поэтому, когда foo
false
, точный реверс того, что предназначалось, будет иметь место.
Так как do / while имеет фигурные скобки, временные переменные имеют четко определенные область действия, с которой они не могут убежать.
Некоторые макросы активируются только в отладочных сборках. Вы определяете их как:
#if DEBUG
#define DBG_PRINT_NUM(n) printf("%d\n",n);
#else
#define DBG_PRINT_NUM(n)
#endif
Теперь, если вы используете это в сборке релизов внутри условного выражения, он компилируется в
if( foo )
;
. Многие компиляторы видят это как то же, что
if( foo );
, который часто записывается случайно. Поэтому вы получаете предупреждение. Do {} while (false) скрывает это от компилятора и принимается им как указание на то, что вы действительно ничего не хотите здесь делать.
Макрос из предыдущего примера:
if( foo )
DBG_PRINT_NUM(42)
doSomething();
Теперь, в сборке отладки, поскольку мы также обычно включаем точку с запятой, это компилируется просто отлично. Однако в релиз-сборке это внезапно превращается в:
if( foo )
doSomething();
Или более четко отформатировано
if( foo )
doSomething();
Это совсем не то, что было предназначено. Добавление do {...} while (false) вокруг макроса превращает недостающую точку с запятой в ошибку компиляции.
В общем, вы хотите использовать исключения в C ++ для обработки ошибок и шаблоны вместо макросов. Однако в очень редком случае, когда вам все еще нужны макросы (например, при генерации имен классов с использованием вставки меток) или они ограничены равным C, это полезный шаблон.
Вы можете использовать метод log
:
console.log(lookatthis);
Вы достигаете этого, используя функцию подсказки
var lookatthis = prompt('Type the lokaltthis value');
В любом месте вашего блока скриптов после первоначального присвоения lookatthis вы можете записать значение в консоль с помощью команды:
console.log (lookatthis);
Если вам нужно иметь возможность «установить» значение lookatthis, вы можете использовать вход и с помощью jquery или pure js получить значение ввода и присвоить его «lookatthis».
Редактировать: Вы также можете использовать в консоли Chrome: lookatthis=25
, но, поскольку ваш скрипт загружается при загрузке страницы, изменения не будут отображаться, но значение будет изменено