3
int num = 5;

for(int i = 0; i < num; i++)
{
    cout << i; 
}

for(int i = 0; i < num; i++)
    cout << i;

4 Answers4

5

Нет никакой разницы.

Согласно стандарту C++ (6.5 Iteration statements)

2 The substatement in an iteration-statement implicitly defines a block scope (3.3) which is entered and exited each time through the loop. If the substatement in an iteration-statement is a single statement and not a compound-statement, it is as if it was rewritten to be a compound-statement containing the original statement. [ Example:

while (--x >= 0)
    int i;

can be equivalently rewritten as

while (--x >= 0) {
    int i;
}

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

Однако в C эти предложения из примера из стандарта C++ не эквивалентны. В C объявление не является предложением. Поэтому в C вы не можете записать

while (--x >= 0)
    int i;

Компилятор выдаст сообщение об ошибке, так как.

    int i;

не является предложением. Это объявление.

Но вы можете записать

while (--x >= 0) {
    int i;
}

так как объявления можно помещать в кодовый блок.

В этом состоит одно из различий C++ и C.

Еще один наглядный пример того, как это различие сказывается на программах, написанных на C++ и C, указан в этой теме на моем персональном форуме.

5

Если не использовать фигурные скобки для отделения блока можно получить, ошибку при добавлении операторов

int i = 6;
while(i--)
   do_some(i);
   do_some_to(i); //вызов только после выполнения цикла, а не в цикле как, возможно, преполагалось

Кроме того блоком можно управлять областью видимости переменной

int i = 6;
while(i--){
    const auto tmp_var = do_some(i);
    do_some_to(tmp_var);
}

Общая рекомендация, для сокращения ошибок и читабельности кода всегда использовать {}. Избегать конструкций в одну строку вида:

for(int = 0;i<10; i++) do_some(i);
JK_Action
  • 923
  • Здесь я полностью соглашусь с sitev_ru, что нет никакой необходимости использовать фигурные скобки в этом for предложении for(int = 0;i<10; i++) do_some(i);, и без фигурных скобок в одну строчку оно выглядит более читабельным как одно предложение языка. – Vlad from Moscow Sep 22 '15 at 19:14
  • @VladfromMoscow , например, в гугл считают иначе: https://google-styleguide.googlecode.com/svn/trunk/cppguide.html#Loops_and_Switch_Statements – Croessmah stands with Russia Sep 22 '15 at 20:57
  • @Croessmah И что из того? А в другой фирме другие низко-квалифицированные программисты будут считать по-другому. При этом имейте в виду, что внутри-фирменный стиль - это что-то среднее, что гребет все под одну гребенку. То есть это усредниловка. – Vlad from Moscow Sep 22 '15 at 21:03
  • 1
    @VladfromMoscow, Макконнелл тоже писал, что избегает такого стиля. Например, он пишет, что при использовании построчного отладчика, сие будет рассматриваться как одно целое, что не есть хорошо. Также нарушается структура вложенности кода и это тоже не айс. И знаете, я с ним полностью согласен. Лично мне категорически не нравится стиль в одну строчку. Конечно, это спор о вкусе и цвете, выбранных в конторе. – Croessmah stands with Russia Sep 22 '15 at 21:22
  • @Croessmah Вот и хорошо, что такое предложение будет рассматриваться в отладчике как одно целое! Там нечего делить на составляющие. Например, вы можете написать два предложения: for ( int x : a ) std::cout << x << ' '; std::cout << std::endl; Либо вставить фигурные скобки и из простого цикла сделать составное предложение там, где оно совершенно не нужно. Все эти книжки, а также стили, устанавливаемые на фирмах, рассчитаны на начинающих программистов, которые еще не имеют опыта, не имеют вкуса, не имеют понимания, а потому им рекомендовано просто копировать то, что другие говорят. – Vlad from Moscow Sep 22 '15 at 21:27
  • @Croessmah Я вам приведу характерный пример такого бездумного идолопоклонения. Многие советуют начинающим программистам читать косноязычего Страуструпа по той причине, что Страуструп - основатель языка C++. И тем самым делают плохую услугу начинающим программистам, так как эффект от прочтения книги Страуструпа начинающим программистом обычно близок к нулю, а время тратиться очень много, так как из-за косноязычия книги Страуструпа обычно очень толстые.. . – Vlad from Moscow Sep 22 '15 at 21:35
  • @VladfromMoscow никто идолам не поклоняется. Я был против такого стиля категорически еще до прочтения "умных" книг. Дальнейший спор о этом, думаю, не имеет смысла. А на счет книги Страуструпа согласен - новичкам оно не нужно, имеет смысл почитать, когда уже есть багаж знаний, иначе эффект может быть не только нулевым, но и вовсе отрицательным. – Croessmah stands with Russia Sep 22 '15 at 21:42
1

Занимает 4 строчки:

for(int i = 0; i < num; i++)
{
    cout << i; 
}

Занимает одну строчку:

for(int i = 0; i < num; i++) cout << i;

Я, обычно, не слушаю всякие рекомендации, что пиши обязательно фигурные скобки. Читабельность программного кода возрастает, если записано в одну строчку. Рекомендую 2-й вариант!

sitev_ru
  • 2,042
  • 3
    Вы - крутой перец!:) Особенно мне понравилось, что этот блок for(int i = 0; i < num; i++) { cout << i; } занимает 4 строчки.:) Кстати сказать его точно также можно переписать в одну строчку, сохранив фигурные скобки. Они этому не препятствуют.:) – Vlad from Moscow Sep 22 '15 at 11:28
  • Скобки же мешают... Ещё помню писал на паскале, так там вообще begin end – sitev_ru Sep 23 '15 at 12:17
1

Разницы нет, а скобки обсуждаются в другой теме:
Объясните мне пожалуйста, зачем нужно всегда ставить { и }
И мой ответ там.

Qwertiy
  • 123,725