Значение do-while в этом коде

в учебник Nextpeer Вы можете увидеть такой код:

CCScene* GameLayer::scene() {
CCScene * scene = NULL;
do {
// 'scene' is an autorelease object
scene = CCScene::create();
CC_BREAK_IF(! scene);

// 'layer' is an autorelease object
GameLayer *layer = GameLayer::create();
CC_BREAK_IF(! layer);

// add layer as a child to scene
scene->addChild(layer);
} while (0);

// return the scene
return scene;
}

Каково значение do-while заблокировать в этом коде?

1

Решение

CC_BREAK_IF это макрос для if(condition) break, (Изменить: я подтвердил, что это.)

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

do {
if (!condition0) break;
action0();
if (!condition1) break;
action1();
} while(0);

do...while(0); существует только для того, чтобы оператор break мог пропустить часть кода.

Это будет похоже на:

if (!condition0) goto end;
action0();
if (!condition1) goto end;
action1();
end:

За исключением того, что избегает использования goto.

Использование любого из этих идиом состоит в том, чтобы избежать вложенного if:

if (condition0) {
action0();
if (condition1) {
action1();
}
}
5

Другие решения

В C и C ++ break Оператор работает только в определенных контекстах: while, do/while или же for петля или в switch заявление. CC_BREAK_IF макрос предположительно выполняет break если условие выполнено. Это простой метод для обработки исключительных / ошибочных состояний в C (обработка исключений для бедного человека, если хотите).

do/while цикл, который никогда не зацикливается, просто обеспечивает контекст для break заявления на работу.

2

Смысл сделать CC_BREAK_IF операторы работают правильно, то есть разорвать цикл и перейти к return scene;,

1

Это распространенный метод, когда у вас есть несколько условных операторов, которые в противном случае приводили бы к цепочке if/else статьи. Вместо этого вы используете один итерационный цикл и используете break операторы для выхода из цикла (CC_BREAK_IF это, вероятно, макрос, который проверяет выражение и break если правда).

0
По вопросам рекламы [email protected]