0 в операторе while
У меня есть один вопрос, и, пожалуйста, помогите мне.я прочитал на веб-странице кое-что о заявлении do while, отличающееся тем, что в while написано 0, а не булево условие
do{
// do some instruction
}while(condition );
Понятно, но этот
do
{
//again some instruction
}while(0);
Я не могу догадаться, что он делает?является ли это эквивалентностью этому: делать что-то в то время как(ложь)?или, может быть, это бесконечность петли?пожалуйста, помогите мне
5 ответов:
Он делает что-то только один раз. Он широко используется в макросах для группировки операторов и делает использование более естественным (т. е. требует окончания запятой).
Любой компилятор стоит его соли должны игнорировать вообще .. в то время как в целом и просто запустите прилагаемые инструкции.
Хотя этот" цикл " выполняется только один раз, можно использовать его следующим образом:
do { // declare some local variables only visible here // do something if(TestSomeConditions()) break; // do something more // destructors of local variables run here automatically }while(0);
ИМХО, в большинстве случаев лучше переписать это более структурированным образом, либо так
// do something if(!TestSomeConditions()) { // do something more }
Или путем введения отдельной функции, отражающей исходную область применения:
void MyFunction() { // declare some local variables only visible here // do something if(TestSomeConditions()) return; // do something more }
Он будет рассматривать 0 как false и один цикл времени будет выполняться и прерываться, как только достигнет while (G++ compiler tested).
Цикл do while сначала выполняет все инструкции в теле цикла, а затем проверяет условие. Следовательно, этот цикл просто выполняет инструкции тела цикла один раз.
do { //my instructions }while(0)
Эквивалентно написанию
{ //my instructions }
Современные компиляторы достаточно умны, чтобы оптимизировать эти вещи!
С технической точки зрения, он заставляет его работать один раз, поскольку он проверяет (и не выполняет проверку) после того, как он работает один раз.
Кроме этого, он используется в макросах. Например:
#define blah(a) \ something(1); \ something(2) if(a) blah(4); else blah(19);
Приведет к следующему:
... if(a) something(1); something(2); else something(1); something(2);
, который не является допустимым синтаксисом, так как else больше не является частью оператора if. Что вы можете сделать, это:
define blah(a) \ do { something(1); something(2); } while(0) ...
, который будет переведен в один оператор в блоке if:
if(a) do { something(1); something(2); } while(0); else ...