Насколько эстетично не ставить некоторые {} в C++ коде?
Я начинаю изучать C++. По ходу изучения, заметил определенную вещь, а именно возможность не ставить фигурные скобки ({}) для ограничения например, тела цикла, ветвления и т.д. При этом, во время компиляции, никаких проблем нет и код без фигурных скобок работает так же правильно, как и код с ними.
Хотелось бы узнать, насколько это правильно с точки зрения эстетичности кода и какой вариант использовать и есть ли вообще хоть какая-то разница.
Для примера приведу код с фигурными скобками:
#include <iostream>
using namespace std;
int main() {
while (true)
{
cout << "Hello, world" << endl;
}
}
Без фигурных скобок:
#include <iostream>
using namespace std;
int main() {
while (true)
cout << "Hello, world" << endl;
}
Ответы (2 шт):
Вопрос скорее не эстетики. Если в команде принято так или эдак - делайте, как в команде. Если работаете в одиночку - как вам удобно. Но учтите, что без скобки потом, впопыхах, вы можете добавить еще одну строчку и забыть о скобках. И хорошо, если это будет что-то типа
if (a > b)
cout << "OK";
else
cout << "Fail";
превратившееся в
if (a > b)
с = a - b;
cout << "OK";
else
cout << "Fail";
где компилятор выручит... А если
while (true)
cout << "Hello, world" << endl;
превратится в
while (true)
n++;
cout << "Hello, world" << endl;
Тогда как? Поэтому я бы рекомендовал (не навязывая :)) как начинающему ставить скобки, просто для своего же спокойствия.
Со временем вы решите сами, как вам удобнее.
И еще раз - работая в команде с выработанным стилем кодирования - придерживайтесь стиля команды.
Ставить или не ставить скобки - ни разу не вопрос эстетичности или удобства. Возможность в некоторых ситуациях опускать фигурные скобки, как и другие компактифицирующие конструкции, была заложена в язык с определенной целью - сократить объем файлов с кодом. Это было очень актуально в 70-е и 80-е и способствовало широкому распространению С, а затем и С++, но сейчас является скорее атавизмом.
Проблемы обычно начинаются c посыла "никаких проблем нет и код без фигурных скобок работает так же правильно, как и код с ними".
- выражение в теле цикла или ветвления может внезапно оказаться макросом:
#define gl_produce(ind, h) ktr_produce2(ind, h); if (0 != ktr_error()) { return -1; }
...
while (count--)
gl_produce(count, h);
- даже когда внутри ветвления действительно только одно выражение, опускание скобок может приводить к внезапному изменению принадлежности блоков:
if (condition)
do_something();
else
do_something_else();
// добавляется еще одно внутреннее условие
if (condition)
if (new_condition)
do_something();
else // теперь относится к if (new_condition)
do_something_else();
- хотя конструкции
caseформально вообще не содержат скобок, как часть, однако их наличие или отсутствие напрямую влияет на работоспособность таких блоков:
switch(num)
{
case 1:
::std::string sdf{};
::std::cout << sdf;
break;
case 2: // ошибка, пропуск инициализации sdf
::std::cout << "hello";
break;
}