最近做了浙大oj的第1011道题,遇见一件奇怪的事。这道题我用c++和php做,提交后都正确。但是用完全相同的逻辑改写成python代码提交后却产生了Non-zero Exit Code的判题结果。python的这一判题结果大多表示程序在运行过程发生了未捕捉的异常。经反复提交排查后确定未捕捉的异常是IndexError,也就是数组下标越界异常。进一步排查后确定应该是因为在测试用例的树结点中有超过第一行所给的参数k的范围的字母存在。解决方法是在使用结点作为的下标之前先判断该下标是否越界,若越界,则直接return 0。
但是让我奇怪的是为什么这一错误没有在c++和php代码中体现出来?原因是因为在这些语言中根本没有下标越界这一说法!比如下面的c++代码是可以运行,完全没有问题的,只是输出的结果可能是不确定的而已。
#include <iostream>
using namespace std;
int main()
{
int a[2];
cout << a[-1];
return 0;
}
这里数组名a其实相当于一个常量地址值,a[-1]代码表示的是a这个地址值偏移一个整型变量大小的地址处的内容所表示的整型值。同样下面的php代码也是可以运行的:
<?php
$a = [1,2];
print $a[-1];
?>