Делаем if () {} while () оператор

В настоящее время я работаю над чьим-то другим кодом с таким утверждением

if(x.start()) do if(y.foo(x)) {

// Do things

}while(x.inc())

Вот x это пользовательский класс, который содержит информацию о y и позволяет выполнять итерацию по своему элементу в специальном порядке. Я поместил эту информацию, если это уместно, но мой вопрос носит более общий характер:

Я думал, что в do{}while() заявление do часть должна была сопровождаться кронштейном, и это вместе с while() условие в конце определяет цикл do-while.

  • Почему мы можем положить if сразу после do?
  • Что оно делает?
  • Что еще можно поставить между do а также {?

Я не мог найти другие вопросы, связанные с этим или в Google, большинство вещей, связанных с положением if заявления внутри while loop,

7

Решение

Грамматика разрешает любой заявление между do а также while, Просто вы обычно видите определенную форму заявление там — компаунд-заявление, { /* statements */ }также обычно называется блоком.

Часть кода do-while точно соответствует

do {
if(y.foo(x)) {
// Do things
}
} while(x.inc());
9

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

Оператор do-while определяется следующим образом

do statement while ( expression ) ;

Таким образом, между оператором do и while может быть любое утверждение, включая утверждение if.

Что касается вашего вопроса

• Что еще можно поставить между do и {?

Согласно грамматике после этого должно быть утверждение. Таким образом, единственная возможность, которая может выглядеть странно, но действительна, это разместить ярлык. Например

do L1: { std::cout << "Hello do-while!" << std::endl; } while ( false );

потому что помеченные заявления также могут быть использованы.

Например, утверждение do-while из вашего поста может выглядеть так:

if(x.start()) do Come_Here: if(y.foo(x)) {

// Do things

}while(x.inc())

Учтите, что вы также можете использовать пустое заявление. В этом случае это будет выглядеть

do ; while ( false );

или же

do Dummy:; while ( false );

И еще одно забавное утверждение

do One: do Two: do Three:; while ( 0 ); while ( 0 ); while ( 0 );

Также в C ++ декларации также есть операторы. Таким образом, вы можете поместить объявление между делом и временем.

Например

int n = 10;
do int i = ( std::cout << --n, n ); while ( n );

В C декларации не являются заявлениями. Таким образом, вы не можете поместить объявление между до и в то время как в C.

И еще один забавный пример

#include<iostream>
#include <vector>
#include <stdexcept>

int main()
{
std::vector<int> v = { 1, 2, 3 };
size_t i = 0;

do try { std::cout << v.at( i ) << ' '; }  catch ( const std::out_of_range & )
{ std::cout << std::endl; break; } while ( ++i );

return 0;
}

Выход программы

1 2 3
5

Согласно стандарту C ++ 14,

§6.5 Итерационные операторы:

do statement while ( expression );

куда statement может быть:

§6 Заявления:

labeled-statement
expression-statement
compound-statement (also, and equivalently, called “block”):
{ statement-seq }
statement-seq:
statement
statement-seq statement
...

Таким образом, вы можете поставить любой действительный заявления между do а также while,

Обратите внимание, что в делать Заявление подотчет выполняется многократно, пока значение expression становится false, Тест проводится после каждого выполнения statement,

2

Я думаю, что этот вид отступа вносит некоторую путаницу.

Я бы лично написал это:

if(x.start())
do
if(y.foo(x)) {
// Do things
}
while(x.inc())

Оператор после do не нуждается в скобках, если это только одна «строка». Как и в случае, вы используете скобки только тогда, когда у вас есть больше инструкций. В этом случае квадратные скобки предназначены для if и, поскольку у do-while есть только одна инструкция, которую он не использует в квадратных скобках.

Это то, что я думаю, если кто-то может подтвердить, было бы лучше.

0

Грамматика утверждения do:

сделать заявление while (выражение);

По сути, вы можете поместить любой оператор после ключевого слова do и перед ключевым словом while. В общем использовании мы следуем за do с помощью фигурных скобок, чтобы разрешить группировку нескольких операторов (составной оператор), но если вы хотите поместить только один оператор после ключевого слова do, фигурная скобка является необязательной. Хотя я бы настоятельно рекомендовал использовать фигурные скобки для удобства чтения.

В вашем случае, если блок — одно законченное утверждение, и это совершенно нормально.

Вот еще один пример оператора do, который содержит один оператор.

int i = 0;

do std::cout<<i<<std::endl;
while (i++ < 5);
0