为什么C#中x / Convert.ToInt32(0) == 0运行时未抛出除零异常?
问题现象
梳理跟踪输出相关习题时,发现以下代码行运行时没有抛出预期的异常:
if(x != 10 && x / Convert.ToInt32(0) == 0)
原本的分析逻辑如下:
- 步骤1:
Convert.ToInt32(0)执行结果为0,0做除数理应触发System.DivideByZeroException - 步骤2:但实际运行时整个
x != 10 && x / Convert.ToInt32(0) == 0条件结果为false
完整可运行代码
class Program { static void Main(string[] args) { int x, y = 1; x = 10; if(x != 10 && x / Convert.ToInt32(0) == 0) Console.WriteLine(y); else Console.WriteLine(++y); Console.ReadLine(); } }
运行输出结果为2,运行效果截图:
原因说明
这是C#中&&运算符的短路求值特性导致的:逻辑与运算符&&仅在左侧表达式结果为true时,才会继续计算右侧表达式的结果。如果左侧表达式已经为false,整个逻辑与表达式的结果已经可以确定为false,右侧表达式会被直接跳过不会执行。
本案例中x被赋值为10,因此x != 10的计算结果为false,右侧的除以零运算代码根本不会被执行,自然不会触发DivideByZeroException异常。程序会直接进入else分支执行++y,所以最终输出结果为2。
如果将代码中的&&替换为非短路逻辑与运算符&,则左右两侧的表达式都会被强制计算,就会触发预期的除以零异常。
内容的提问来源于stack exchange,提问作者Preeti Singh
相关产品推荐
相关产品推荐

