C# 试题 05:流程控制
0081 以下代码运行结果是什么?
难度: 进阶
int x = 42;
string s = x switch
{
1 => "one",
2 => "two",
};
Console.WriteLine(s);
- A. 输出
one - B. 编译失败,switch 表达式必须穷尽
- C. 编译通过但有警告,运行抛
SwitchExpressionException - D. 输出空字符串
查看答案与解析
正确答案C
解析: 对 int 的 switch 表达式没有覆盖所有输入时,编译器只给出 CS8509 警告(不报错),运行时若无分支命中则抛 SwitchExpressionException。
关键点: switch 表达式的穷尽性检查默认是警告,运行时兜底是异常。
0082 以下代码编译并运行,结果是什么?
难度: 进阶
enum Color { Red, Green, Blue }
Color c = Color.Green;
string s = c switch
{
Color.Red => "R",
Color.Green => "G",
Color.Blue => "B",
};
Console.WriteLine(s);
- A. 编译失败,枚举 switch 必须带默认分支
- B. 编译无警告,输出
G - C. 编译警告,运行抛
SwitchExpressionException - D. 编译警告 CS8524(未穷尽),输出
G
查看答案与解析
正确答案D
解析: 枚举值可以来自未命名成员(如 (Color)99),因此即使覆盖全部命名成员,编译器仍判定不穷尽并给出 CS8524 警告;本例 Green 命中分支输出 G,若输入未命名枚举值则会抛 SwitchExpressionException。
关键点: “覆盖所有命名成员”不等于“穷尽”,枚举 switch 常需 _ 兜底。
0083 以下代码输出什么?
难度: 实战
int count = 0;
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
if (j == 1) continue;
count++;
}
}
Console.WriteLine(count);
- A.
3 - B.
6 - C.
9 - D. 编译失败
查看答案与解析
正确答案B
解析: continue 作用于最近的一层循环:内层 j 跳过 1 后每轮只累加 j = 0 和 j = 2 两次,外层 3 轮共 6 次。
关键点: continue/break 只影响最近一层循环。
0084 以下代码输出什么?
难度: 实战
int i = 0;
while (i < 5)
{
i++;
if (i == 3) continue;
Console.Write(i);
}
- A.
12345 - B.
123 - C.
1234 - D.
1245
查看答案与解析
正确答案D
解析: i 在循环体开头自增,i == 3 时 continue 跳过打印,其余 1、2、4、5 正常输出。
关键点: continue 跳过的是本次迭代的剩余语句,循环条件与递增仍需自行维护。
0085 以下代码输出什么?
难度: 实战
static string M()
{
try
{
return "R";
}
finally
{
Console.Write("F");
}
}
Console.WriteLine(M());
- A.
FR - B.
RF - C.
R - D.
F
查看答案与解析
正确答案A
解析: finally 在 return 表达式求值之后、方法真正返回之前执行:先打印 F,方法再返回 R,外层打印 R,整体输出 FR。
关键点: return 先求值,finally 在真正返回前执行。
0086 以下代码能否编译?
难度: 进阶
static int M()
{
try
{
return 1;
}
finally
{
return 2;
}
}
Console.WriteLine(M());
- A. 能编译,输出
1 - B. 能编译,输出
2 - C. 编译失败,控制流不能从 finally 块中离开(CS0157)
- D. 能编译,运行抛异常
查看答案与解析
正确答案C
解析: 语言规范禁止 return、break、continue、goto 等从 finally 块中转出控制流,编译报 CS0157;finally 只允许正常执行完或抛异常。
关键点: 在 finally 中 return 是编译错误,不是“覆盖返回值”。
0087 以下代码输出什么?
难度: 进阶
var x = true ? 1 : 2.5;
Console.WriteLine(x.GetType().Name);
Console.WriteLine(x);
- A.
Int32和1 - B.
Double和1 - C.
Double和1.5 - D. 编译失败
查看答案与解析
正确答案B
解析: 条件表达式要求两个分支存在隐式转换:int 可隐式转 double,结果类型为 double;条件为真取 1,转为 1.0,打印 Double 与 1。
关键点: 条件表达式的结果类型由两个分支按隐式转换规则收敛,而不是“取第一个分支的类型”。
0088 以下代码能否编译?
难度: 进阶
var x = true ? null : 42;
Console.WriteLine(x is null);
- A. 能编译,输出
True - B. 能编译,输出
False - C. 编译失败,
var无法推断条件表达式类型,null与int之间没有隐式转换(CS0173) - D. 能编译,输出
42
查看答案与解析
正确答案C
解析: 条件运算符要求两个分支互为隐式转换目标;null 字面量不会自动“变成” int?,var 无从推断类型,报 CS0173。若目标类型明确(如 int? x = true ? null : 42;)则合法。
关键点: 带 null 分支的条件表达式需要目标类型参与推断,不能只靠 var。
0089 以下代码输出什么?
难度: 实战
int sum = 0;
for (int i = 1; i <= 3; i++)
{
if (i == 2) goto end;
sum += i;
}
end:
Console.WriteLine(sum);
- A.
1 - B.
0 - C.
3 - D.
6
查看答案与解析
正确答案A
解析: i == 2 时 goto end 跳出循环,只累加了 i = 1,sum 为 1;标签 end: 位于循环之后。
关键点: goto 的目标标签必须与 goto 位于同一函数体内。
0090 以下代码能否编译?
难度: 实战
goto label;
int x = 1;
label:
Console.WriteLine(x);
- A. 能编译,输出
1 - B. 编译失败,跳转绕过了
x的初始化,x可能未被赋值(CS0165) - C. 能编译,输出
0 - D. 能编译,运行抛
NullReferenceException
查看答案与解析
正确答案B
解析: goto 向前跳转会绕过 int x = 1 的初始化,编译器按“可能未赋值”判定 x 的使用非法,报 CS0165。
关键点: goto 不能跳入会跳过局部变量初始化的作用域。
0091 以下代码输出什么?
难度: 进阶
static void M()
{
try
{
throw new InvalidOperationException();
}
catch (Exception)
{
Console.Write("C");
throw;
}
finally
{
Console.Write("F");
}
}
try
{
M();
}
catch (Exception)
{
Console.Write("X");
}
- A.
CFX - B.
CX - C.
FCX - D.
CF
查看答案与解析
正确答案A
解析: catch 打印 C 并 throw 重抛,finally 在异常继续传播前打印 F,外层 catch 打印 X。
关键点: 异常传播途中 finally 仍会执行,顺序是 catch → finally → 外层。
0092 以下代码输出什么?
难度: 实战
int count = 0;
foreach (var ch in "a b c")
{
if (ch == ' ') continue;
count++;
}
Console.WriteLine(count);
- A.
5 - B.
3 - C.
4 - D.
7
查看答案与解析
正确答案B
解析: 字符串 "a b c" 共 5 个字符,两个空格被 continue 跳过,非空字符 3 个。
关键点: foreach 中 continue 同样跳过本次迭代剩余语句。
0093 以下代码输出什么?
难度: 实战
int score = 75;
string grade = score switch
{
>= 90 => "A",
>= 80 => "B",
>= 60 => "C",
_ => "D",
};
Console.WriteLine(grade);
- A.
D - B.
B - C.
C - D.
A
查看答案与解析
正确答案C
解析: 关系模式按声明顺序自上而下匹配,75 不满足 >= 90 与 >= 80,命中 >= 60 输出 C。
关键点: switch 表达式按分支顺序取第一个匹配,关系模式区间要保证顺序。
0094 以下代码能否编译?
难度: 实战
static void M(int x)
{
switch (x)
{
case 1:
Console.Write("1");
case 2:
Console.Write("2");
break;
}
}
M(1);
- A. 能编译,输出
12 - B. 能编译,输出
1 - C. 能编译,运行抛异常
- D. 编译失败,非空 case 分支不能贯穿到下一个 case(CS0163)
查看答案与解析
正确答案D
解析: C# 的 switch 语句中,含语句的 case 分支末尾必须显式跳出(break/return/goto),不允许 C 风格的隐式贯穿,编译报 CS0163;只有空 case 可以堆叠。
关键点: “空 case 可堆叠、非空 case 必须跳出”是 C# 与 C 的关键差异。
0095 以下代码输出什么?
难度: 进阶
var x = true ? 1 : 2L;
Console.WriteLine(x.GetType().Name);
- A.
Int32 - B.
Int64 - C.
UInt64 - D. 编译失败
查看答案与解析
正确答案B
解析: int 可隐式转换为 long,条件表达式结果类型为 long,x 是 Int64。
关键点: 条件表达式做“公共类型”收敛时,优先选择能容纳两者的更宽类型。
0096 以下代码输出什么?
难度: 实战
int i = 0, sum = 0;
do
{
i++;
if (i % 2 == 0) continue;
sum += i;
} while (i < 5);
Console.WriteLine(sum);
- A.
9 - B.
6 - C.
15 - D.
10
查看答案与解析
正确答案A
解析: i 依次为 1~5,偶数 2、4 被 continue 跳过,累加 1 + 3 + 5 = 9。
关键点: do 循环至少执行一次,continue 后仍会回到条件判断。
0097 以下代码输出什么?
难度: 实战
int n = 0;
string s = n switch
{
>= 0 => "nonneg",
< 0 => "neg",
};
Console.WriteLine(s);
- A.
nonneg - B.
neg - C. 编译失败
- D. 编译警告且运行抛异常
查看答案与解析
正确答案A
解析: 对 int 而言 >= 0 与 < 0 两个关系模式覆盖全部取值,编译器判定穷尽、无警告;0 命中第一个分支输出 nonneg。
关键点: 关系模式组合能证明穷尽时,不需要 _ 兜底也不会有警告。
0098 关于 finally 与 return 的执行顺序,哪项正确?
难度: 进阶
- A.
finally在return表达式求值之前执行 - B. 只要控制流进入
try,无论正常返回还是抛异常,finally都会在控制离开方法前执行;return表达式的值先于finally计算 - C.
try中return时finally不执行 - D.
catch中return时finally不执行
查看答案与解析
正确答案B
解析: finally 保证在控制流离开 try/catch 之前执行;return 先求值并暂存结果,finally 执行完方法才真正返回,catch 中 return 同理。
关键点: “先求值、后执行 finally、再真正返回”是理解 finally 的顺序模型。
0099 关于 switch 表达式与 switch 语句的差异,哪项正确?
难度: 进阶
- A. 两者都必须穷尽
- B. switch 表达式必须穷尽,否则可能抛
SwitchExpressionException;switch 语句没有穷尽性要求 - C. switch 表达式允许非空 case 贯穿
- D. 两者等价
查看答案与解析
正确答案B
解析: switch 表达式是产生值的表达式,编译器要求穷尽(不穷尽给警告,运行时抛 SwitchExpressionException);switch 语句没有穷尽性约束,未命中任何 case 时直接跳过。
关键点: 表达式要“有值”,因此穷尽是硬约束;语句可以“什么都不做”。
0100 关于 goto 的合法目标,哪项正确?
难度: 实战
- A.
goto可跨方法跳转 - B.
goto可跳入catch/finally块内部 - C. 标签必须先于
goto声明 - D.
goto只能在同一函数体内跳转,且不能跳入会绕过局部变量初始化的作用域
查看答案与解析
正确答案D
解析: 标签属于声明它的函数体,跨函数跳转非法;跳入 catch/finally、跳过局部变量初始化(CS0165)也都是编译错误;标签可以位于 goto 之后(向前跳)。
关键点: goto 的合法目标是“同函数内、不破坏初始化与异常处理边界”的标签。