Требование, чтобы объявления переменных появлялись в начале составного оператора, не ухудшило выразительность C89.Все, что можно было бы законно сделать, используя объявление в середине блока, можно было бы сделать так же, добавив открытую скобку перед объявлением и удвоив закрывающую скобку вмещающего блока.Хотя такое требование иногда может иметь загроможденный исходный код с дополнительными открывающими и закрывающими скобками, такие скобки не были бы просто шумом - они отмечали бы начало и конец областей действия переменных.
Рассмотрим следующие два примера кода:
{
do_something_1();
{
int foo;
foo = something1();
if (foo) do_something_1(foo);
}
{
int bar;
bar = something2();
if (bar) do_something_2(bar);
}
{
int boz;
boz = something3();
if (boz) do_something_3(boz);
}
}
и
{
do_something_1();
int foo;
foo = something1();
if (foo) do_something_1(foo);
int bar;
bar = something2();
if (bar) do_something_2(bar);
int boz;
boz = something3();
if (boz) do_something_3(boz);
}
С точки зрения времени выполнения большинству современных компиляторов, вероятно, не будет интересно, является ли синтаксически синтаксис foo
в области видимости во время выполнения do_something3()
, поскольку он может определить, что любое значение, которое он имел до этого оператора, не будет использоваться после.С другой стороны, поощрение программистов писать объявления таким образом, чтобы генерировать неоптимальный код в отсутствие оптимизирующего компилятора, вряд ли является привлекательной концепцией.
Кроме того, при обработке более простых случаев, включающих смешанные объявления переменныхне будет трудным (даже компилятор 1970-х годов мог бы сделать это, если бы авторы хотели разрешить такие конструкции), все усложнилось бы, если бы блок, содержащий смешанные объявления, также содержал какие-либо метки goto
или case
.Создатели C, вероятно, думали, что разрешение смешивания объявлений переменных и других операторов слишком усложнит стандарты, чтобы стоить выгоды.