C#嵌套for循环移除大括号后输出异常、换行失效问题咨询
问题产生原因
C# 语法规定:for、if、while等控制流语句如果没有配套的大括号{}定义代码块,只会将紧随其后的第一条语句纳入自身的执行范围,代码的缩进仅用于提升开发者可读性,完全不影响编译器的语法解析逻辑。
两段代码的执行逻辑差异如下:
原带大括号代码的逻辑
外层i循环的代码块包含了内层j循环和换行语句,每轮i循环的执行流程为:
- 执行完整的内层
j循环,输出当前行的所有矩阵元素 - 执行
Console.WriteLine()完成当前行换行
因此每输出一行矩阵元素就会换一次行,和预期逻辑一致。
无大括号修改后代码的实际逻辑
你添加的缩进只是视觉上的逻辑分组,编译器实际识别的执行顺序为:
- 外层
i循环的执行范围仅有紧随其后的内层完整j循环这一条语句 Console.WriteLine()不属于任何循环的执行内容,是PrintBoard方法的独立顶层语句,只会在所有循环全部执行完毕后,总共执行1次
所有矩阵元素都会被连续输出到同一行,仅在全部输出完成后换一次行,就出现了实际输出为一整行的问题。
修正方案(保留部分无大括号写法的正确代码)
如果要省略内层循环的大括号,外层循环的大括号必须保留,将内层循环和换行语句都纳入外层循环的代码块:
public void PrintBoard() { for (int i = 0; i < _matrix.N; i++) { for (int j = 0; j < _matrix.M; j++) Console.Write(_matrix.Get[i, j]); Console.WriteLine(); } }
内容的提问来源于stack exchange,提问作者Sharki
相关产品推荐
相关产品推荐

