В настоящее время я работаю над чьим-то другим кодом с таким утверждением
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
,
Грамматика разрешает любой заявление между do
а также while
, Просто вы обычно видите определенную форму заявление там — компаунд-заявление, { /* statements */ }
также обычно называется блоком.
Часть кода do-while точно соответствует
do {
if(y.foo(x)) {
// Do things
}
} while(x.inc());
Оператор 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
Согласно стандарту 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
,
Я думаю, что этот вид отступа вносит некоторую путаницу.
Я бы лично написал это:
if(x.start())
do
if(y.foo(x)) {
// Do things
}
while(x.inc())
Оператор после do не нуждается в скобках, если это только одна «строка». Как и в случае, вы используете скобки только тогда, когда у вас есть больше инструкций. В этом случае квадратные скобки предназначены для if и, поскольку у do-while есть только одна инструкция, которую он не использует в квадратных скобках.
Это то, что я думаю, если кто-то может подтвердить, было бы лучше.
Грамматика утверждения do:
сделать заявление while (выражение);
По сути, вы можете поместить любой оператор после ключевого слова do и перед ключевым словом while. В общем использовании мы следуем за do с помощью фигурных скобок, чтобы разрешить группировку нескольких операторов (составной оператор), но если вы хотите поместить только один оператор после ключевого слова do, фигурная скобка является необязательной. Хотя я бы настоятельно рекомендовал использовать фигурные скобки для удобства чтения.
В вашем случае, если блок — одно законченное утверждение, и это совершенно нормально.
Вот еще один пример оператора do, который содержит один оператор.
int i = 0;
do std::cout<<i<<std::endl;
while (i++ < 5);