7-1 复合语句(代码块)
复合语句compound statement(也称为代码块block或块语句block statement)是由零个或多个语句组成的集合,编译器将其视为单个语句处理。
代码块以{符号开头,以}符号结束,需执行的语句置于其间。代码块可在允许单条语句的任何位置使用,且块末无需分号。
在编写函数时你已见过代码块的实例——函数主体即为代码块:
int add(int x, int y)
{ // start block
return x + y;
} // end block (no semicolon)
int main()
{ // start block
// multiple statements
int value {}; // this is initialization, not a block
add(3, 4);
return 0;
} // end block (no semicolon)
块嵌套在其他块中
虽然函数不能嵌套在其他函数中,但块可以嵌套在其他块中:
int add(int x, int y)
{ // block
return x + y;
} // end block
int main()
{ // outer block
// multiple statements
int value {};
{ // inner/nested block
add(3, 4);
} // end inner/nested block
return 0;
} // end outer block
当代码块嵌套时,外层包裹的代码块通常称为外部代码块outer block,被包裹的内部代码块则称为内部代码块inner block或嵌套代码块nested block。
使用代码块实现条件执行多条语句
代码块最常见的应用场景之一是与if语句配合使用。默认情况下,当条件为真时,if语句仅执行单条语句。但若需在条件为真时执行多条语句,我们可以将单条语句替换为代码块。
例如:
#include <iostream>
int main()
{ // start of outer block
std::cout << "Enter an integer: ";
int value {};
std::cin >> value;
if (value >= 0)
{ // start of nested block
std::cout << value << " is a positive integer (or zero)\n";
std::cout << "Double this number is " << value * 2 << '\n';
} // end of nested block
else
{ // start of another nested block
std::cout << value << " is a negative integer\n";
std::cout << "The positive of this number is " << -value << '\n';
} // end of another nested block
return 0;
} // end of outer block
如果用户输入数字3,该程序将输出:

如果用户输入数字 -4,该程序将输出:

块嵌套层级
甚至可以将块嵌套在块中,再嵌套在块中:
#include <iostream>
int main()
{ // block 1, nesting level 1
std::cout << "Enter an integer: ";
int value {};
std::cin >> value;
if (value > 0)
{ // block 2, nesting level 2
if ((value % 2) == 0)
{ // block 3, nesting level 3
std::cout << value << " is positive and even\n";
}
else
{ // block 4, also nesting level 3
std::cout << value << " is positive and odd\n";
}
}
return 0;
}
函数的嵌套层级nesting level(也称嵌套深度nesting depth)是指在函数任意位置(包括最外层代码块)所能达到的最大嵌套代码块数量。在上例函数中,虽然存在4个代码块,但嵌套层级为3,因为该程序中任意位置最多只能嵌套3个代码块。
C++标准规定编译器应支持256层嵌套——但并非所有编译器都实现(例如截至撰写本文时,Visual Studio的支持层数更少)。
建议将嵌套层级控制在3层以内。正如过长的函数应进行重构(拆分为更小的函数),过度嵌套的代码块同样难以阅读,也应进行重构(将最深层的嵌套块拆分为独立函数)。
最佳实践
将函数的嵌套层级控制在3层以内。若函数需要更深的嵌套层级,请考虑将该函数重构为子函数。

浙公网安备 33010602011771号