浮点异常?

Floating point exception?

非常直接。下面的代码来自我的一个函数:

int i, j;
for (i = 0; i < m; i++) {
    for (j = 0; j < numberOfVariables; j++) {
        if ((j % i) == 0 && i != 0) {
            table[i][j] = 1;
        }
    }
}

当我调用它时,出现浮点异常。除了我没有使用浮点数。那么到底发生了什么?

i为零时,j % i涉及被零除,这是不允许的。

要防止它,您需要更改此设置:

      if ((j % i) == 0 && i != 0) {

对此:

      if (i != 0 && (j % i) == 0) {

(利用 && 短路 行为:如果左侧操作数的计算结果为 false,则右侧操作数永远不会评估)。

当您在循环中为 i=0 计算 (j % i) == 0 时,这是在后台除以 0。因此浮点异常。

int i,j;
  for (i = 0; i < m; i++) {
    for (j = 0; j < numberOfVariables; j++) {
      if (i != 0 && (j % i) == 0 ) {
        table[i][j] = 1;
      }
    }
  }

在运行时,它将评估 i==0 跳过模 评估。 您之前的做法是在验证 i!=0.

之前评估模数

考虑第一次迭代:

if ((j % i) == 0 && i != 0) {

&&||总是先计算左操作数,如果条件为假,则条件短路。

这意味着当 i != 0 时,它 评估 j % i 首先 ,因此除以零.请注意,除以零是未定义的行为。

您需要将该行替换为:

if (i != 0 && (j % i) == 0) {

这样,当i == 0时,(j % i) == 0不会被计算

但是你不做这个检查,你就不能直接避免这种情况吗?您可以简单地将 i1 迭代到 m,这样您也可以删除检查:

for (i = 1; i < m; i++) {

编辑:您声称遇到浮点异常的运行时可能是错误的,并将算术异常误认为是被零除;或者可能是由于编译器优化。类似的东西。